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)
: sceneXf(conn), aabbMin(conn), aabbMax(conn)
: aabbMin(conn), aabbMax(conn)
{
uint32_t matCount;
conn._readBuf(&matCount, 4);

View File

@ -373,6 +373,7 @@ public:
};
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 */
struct Mesh
@ -531,7 +532,7 @@ public:
struct ColMesh
{
/* Object transform in scene */
Matrix4f sceneXf;
//Matrix4f sceneXf;
/* Cumulative AABB */
Vector3f aabbMin;

View File

@ -1,4 +1,6 @@
#include "BlenderConnection.hpp"
#include <cmath>
#include <float.h>
namespace hecl
{
@ -12,6 +14,15 @@ atVec3f BlenderConnection::DataStream::MtxVecMul4RM(const Matrix4f& mtx, const V
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
{
/* 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]);
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
{
vboW.writeVec3fLittle(pos[v.iPos]);
vboW.writeVec3fLittle(norm[v.iNorm]);
vboW.writeVec3fLittle(norm[v.iNorm]);
}
for (size_t i=0 ; i<colorLayerCount ; ++i)
{

View File

@ -232,16 +232,16 @@ def cookcol(writebuf, mesh_obj):
# Send scene matrix
wmtx = mesh_obj.matrix_world
writebuf(struct.pack('ffffffffffffffff',
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[2][0], wmtx[2][1], wmtx[2][2], wmtx[2][3],
wmtx[3][0], wmtx[3][1], wmtx[3][2], wmtx[3][3]))
#writebuf(struct.pack('ffffffffffffffff',
#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[2][0], wmtx[2][1], wmtx[2][2], wmtx[2][3],
#wmtx[3][0], wmtx[3][1], wmtx[3][2], wmtx[3][3]))
# 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]))
pt = copy_obj.bound_box[6]
pt = wmtx * Vector(copy_obj.bound_box[6])
writebuf(struct.pack('fff', pt[0], pt[1], pt[2]))
# Send materials
@ -261,7 +261,8 @@ def cookcol(writebuf, mesh_obj):
# Send verts
writebuf(struct.pack('I', len(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
writebuf(struct.pack('I', len(copy_mesh.edges)))