MdD(const SectionDataEx &sde, int meshId, const vector<DMat> &mtbm) : triCnt(sde.meshIndex[meshId].size() / 3), id(new Buffer()), vt(new Buffer()), meshVertId(new Buffer()), meshVertWt(new Buffer()) { assert(sde.meshIndex[meshId].size() % 3 == 0); /* Mesh */ id->Bind(oglplus::BufferOps::Target::Array); Buffer::Data(oglplus::BufferOps::Target::Array, ExIntToGLuint(sde.meshIndex[meshId])); vt->Bind(oglplus::BufferOps::Target::Array); Buffer::Data(oglplus::BufferOps::Target::Array, ExFloatToGLfloat(sde.meshVert[meshId])); /* Bone */ meshVertId->Bind(oglplus::BufferOps::Target::Array); Buffer::Data(oglplus::BufferOps::Target::Array, ExIntToGLuint(sde.meshVertId[meshId])); meshVertWt->Bind(oglplus::BufferOps::Target::Array); Buffer::Data(oglplus::BufferOps::Target::Array, ExFloatToGLfloat(sde.meshVertWt[meshId])); boneMeshToBoneMatrix = mtbm; }
void Prime(const MdT &mt, const MdD &md, const DMat &meshMat, const vector<DMat> &boneWorldMatrix) { assert(boneWorldMatrix.size() == md.boneMeshToBoneMatrix.size()); triCnt = md.triCnt; va->Bind(); /* Mesh */ md.id->Bind(oglplus::BufferOps::Target::ElementArray); md.vt->Bind(oglplus::BufferOps::Target::Array); (*prog|"Position").Setup(3, oglplus::DataType::Float).Enable(); /* Bone */ EX_OGLPLUS_ATTRIB_ARRAY_ACTIVE(*prog, "BoneId", md.meshVertId, 4, UnsignedInt); EX_OGLPLUS_ATTRIB_ARRAY_ACTIVE(*prog, "BoneWt", md.meshVertWt, 4, Float); /* MdT */ ProgramUniform<Mat4f>(*prog, "ProjectionMatrix") = mt.ProjectionMatrix; ProgramUniform<Mat4f>(*prog, "CameraMatrix") = mt.CameraMatrix; ProgramUniform<Mat4f>(*prog, "ModelMatrix") = mt.ModelMatrix; OptionalProgramUniform<Mat4f>(*prog, "MeshMat") = DMatToOgl(meshMat); { vector<oglplus::Mat4f> v; assert(boneWorldMatrix.size() == md.boneMeshToBoneMatrix.size()); for (int i = 0; i < boneWorldMatrix.size(); i++) v.push_back(DMatToOgl(DMat::Multiply(boneWorldMatrix[i], md.boneMeshToBoneMatrix[i]))); OptionalProgramUniform<Mat4f>(*prog, "BoneMat").Set(v); } Validate(); }