Blender protocol adjustments

This commit is contained in:
Jack Andersen 2016-08-13 09:36:39 -10:00
parent 98c2313863
commit c89b7692f3
4 changed files with 38 additions and 11 deletions

View File

@ -875,7 +875,7 @@ uint32_t BlenderConnection::DataStream::Mesh::SkinBanks::addSurface
} }
BlenderConnection::DataStream::ColMesh::ColMesh(BlenderConnection& conn) BlenderConnection::DataStream::ColMesh::ColMesh(BlenderConnection& conn)
: sceneXf(conn), aabbMin(conn), aabbMax(conn) : aabbMin(conn), aabbMax(conn)
{ {
uint32_t matCount; uint32_t matCount;
conn._readBuf(&matCount, 4); conn._readBuf(&matCount, 4);

View File

@ -373,6 +373,7 @@ public:
}; };
static atVec3f MtxVecMul4RM(const Matrix4f& mtx, const Vector3f& vec); static atVec3f MtxVecMul4RM(const Matrix4f& mtx, const Vector3f& vec);
static atVec3f MtxVecMul3RM(const Matrix4f& mtx, const Vector3f& vec);
/** Intermediate mesh representation prepared by blender from a single mesh object */ /** Intermediate mesh representation prepared by blender from a single mesh object */
struct Mesh struct Mesh
@ -531,7 +532,7 @@ public:
struct ColMesh struct ColMesh
{ {
/* Object transform in scene */ /* Object transform in scene */
Matrix4f sceneXf; //Matrix4f sceneXf;
/* Cumulative AABB */ /* Cumulative AABB */
Vector3f aabbMin; Vector3f aabbMin;

View File

@ -1,4 +1,6 @@
#include "BlenderConnection.hpp" #include "BlenderConnection.hpp"
#include <cmath>
#include <float.h>
namespace hecl namespace hecl
{ {
@ -12,6 +14,15 @@ atVec3f BlenderConnection::DataStream::MtxVecMul4RM(const Matrix4f& mtx, const V
return res; return res;
} }
atVec3f BlenderConnection::DataStream::MtxVecMul3RM(const Matrix4f& mtx, const Vector3f& vec)
{
atVec3f res;
res.vec[0] = mtx[0].vec[0] * vec.val.vec[0] + mtx[0].vec[1] * vec.val.vec[1] + mtx[0].vec[2] * vec.val.vec[2];
res.vec[1] = mtx[1].vec[0] * vec.val.vec[0] + mtx[1].vec[1] * vec.val.vec[1] + mtx[1].vec[2] * vec.val.vec[2];
res.vec[2] = mtx[2].vec[0] * vec.val.vec[0] + mtx[2].vec[1] * vec.val.vec[1] + mtx[2].vec[2] * vec.val.vec[2];
return res;
}
HMDLBuffers BlenderConnection::DataStream::Mesh::getHMDLBuffers(bool absoluteCoords) const HMDLBuffers BlenderConnection::DataStream::Mesh::getHMDLBuffers(bool absoluteCoords) const
{ {
/* If skinned, compute max weight vec count */ /* If skinned, compute max weight vec count */
@ -88,10 +99,24 @@ HMDLBuffers BlenderConnection::DataStream::Mesh::getHMDLBuffers(bool absoluteCoo
{ {
atVec3f preXfPos = MtxVecMul4RM(sceneXf, pos[v.iPos]); atVec3f preXfPos = MtxVecMul4RM(sceneXf, pos[v.iPos]);
vboW.writeVec3fLittle(preXfPos); vboW.writeVec3fLittle(preXfPos);
atVec3f preXfNorm = MtxVecMul3RM(sceneXf, norm[v.iNorm]);
float mag =
preXfNorm.vec[0] * preXfNorm.vec[0] +
preXfNorm.vec[1] * preXfNorm.vec[1] +
preXfNorm.vec[2] * preXfNorm.vec[2];
if (mag > FLT_EPSILON)
mag = 1.f / std::sqrt(mag);
preXfNorm.vec[0] *= mag;
preXfNorm.vec[1] *= mag;
preXfNorm.vec[2] *= mag;
vboW.writeVec3fLittle(preXfNorm);
} }
else else
{
vboW.writeVec3fLittle(pos[v.iPos]); vboW.writeVec3fLittle(pos[v.iPos]);
vboW.writeVec3fLittle(norm[v.iNorm]); vboW.writeVec3fLittle(norm[v.iNorm]);
}
for (size_t i=0 ; i<colorLayerCount ; ++i) for (size_t i=0 ; i<colorLayerCount ; ++i)
{ {

View File

@ -232,16 +232,16 @@ def cookcol(writebuf, mesh_obj):
# Send scene matrix # Send scene matrix
wmtx = mesh_obj.matrix_world wmtx = mesh_obj.matrix_world
writebuf(struct.pack('ffffffffffffffff', #writebuf(struct.pack('ffffffffffffffff',
wmtx[0][0], wmtx[0][1], wmtx[0][2], wmtx[0][3], #wmtx[0][0], wmtx[0][1], wmtx[0][2], wmtx[0][3],
wmtx[1][0], wmtx[1][1], wmtx[1][2], wmtx[1][3], #wmtx[1][0], wmtx[1][1], wmtx[1][2], wmtx[1][3],
wmtx[2][0], wmtx[2][1], wmtx[2][2], wmtx[2][3], #wmtx[2][0], wmtx[2][1], wmtx[2][2], wmtx[2][3],
wmtx[3][0], wmtx[3][1], wmtx[3][2], wmtx[3][3])) #wmtx[3][0], wmtx[3][1], wmtx[3][2], wmtx[3][3]))
# Filter out useless AABB points and send data # Filter out useless AABB points and send data
pt = copy_obj.bound_box[0] pt = wmtx * Vector(copy_obj.bound_box[0])
writebuf(struct.pack('fff', pt[0], pt[1], pt[2])) writebuf(struct.pack('fff', pt[0], pt[1], pt[2]))
pt = copy_obj.bound_box[6] pt = wmtx * Vector(copy_obj.bound_box[6])
writebuf(struct.pack('fff', pt[0], pt[1], pt[2])) writebuf(struct.pack('fff', pt[0], pt[1], pt[2]))
# Send materials # Send materials
@ -261,7 +261,8 @@ def cookcol(writebuf, mesh_obj):
# Send verts # Send verts
writebuf(struct.pack('I', len(copy_mesh.vertices))) writebuf(struct.pack('I', len(copy_mesh.vertices)))
for v in copy_mesh.vertices: for v in copy_mesh.vertices:
writebuf(struct.pack('fff', v.co[0], v.co[1], v.co[2])) xfVert = wmtx * v.co
writebuf(struct.pack('fff', xfVert[0], xfVert[1], xfVert[2]))
# Send edges # Send edges
writebuf(struct.pack('I', len(copy_mesh.edges))) writebuf(struct.pack('I', len(copy_mesh.edges)))