mirror of
https://github.com/devZoGok/vb01.git
synced 2026-08-26 19:43:30 +00:00
bone transformations influence verts according to weights
This commit is contained in:
@@ -14,15 +14,13 @@ using namespace std;
|
||||
using namespace glm;
|
||||
|
||||
namespace vb01{
|
||||
Mesh::Mesh(){
|
||||
|
||||
}
|
||||
Mesh::Mesh(){}
|
||||
|
||||
Mesh::Mesh(Vertex *vertices,unsigned int *indices,int numTris,VertexGroup *vertexGroups,int numVertexGroups,ShapeKey *shapeKeys,int numShapeKeys,string name){
|
||||
Mesh::Mesh(Vertex *vertices,unsigned int *indices,int numTris,string *vertexGroups,int numVertexGroups,string *shapeKeys,int numShapeKeys,string name){
|
||||
this->vertices=vertices;
|
||||
this->indices=indices;
|
||||
this->numTris=numTris;
|
||||
this->groups=vertexGroups;
|
||||
this->vertexGroups=vertexGroups;
|
||||
this->numVertexGroups=numVertexGroups;
|
||||
this->shapeKeys=shapeKeys;
|
||||
this->numShapeKeys=numShapeKeys;
|
||||
@@ -47,6 +45,8 @@ namespace vb01{
|
||||
}
|
||||
|
||||
void Mesh::construct(){
|
||||
int width=Root::getSingleton()->getWidth();
|
||||
|
||||
u32 RBO;
|
||||
string basePath="../../vb01/depthMap.";
|
||||
environmentShader=new Shader(basePath+"vert",basePath+"frag",basePath+"geo");
|
||||
@@ -71,23 +71,35 @@ namespace vb01{
|
||||
glGenVertexArrays(1,&VAO);
|
||||
glGenBuffers(1,&VBO);
|
||||
glGenBuffers(1,&EBO);
|
||||
|
||||
|
||||
u32 base=sizeof(float);
|
||||
u32 size=(14+3*numShapeKeys)*base;
|
||||
size=sizeof(Vertex);
|
||||
//size=(18)*sizeof(float)+sizeof(Vector3*);
|
||||
//cout<<size<<endl;
|
||||
|
||||
glBindVertexArray(VAO);
|
||||
glBindBuffer(GL_ARRAY_BUFFER,VBO);
|
||||
glBufferData(GL_ARRAY_BUFFER, 3*numTris*sizeof(Vertex),staticVerts?vertices:NULL, staticVerts?GL_STATIC_DRAW:GL_DYNAMIC_DRAW);
|
||||
glBufferData(GL_ARRAY_BUFFER, 3*numTris*size,staticVerts?vertices:NULL, staticVerts?GL_STATIC_DRAW:GL_DYNAMIC_DRAW);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER,3*numTris*sizeof(unsigned int),staticVerts?indices:NULL,staticVerts?GL_STATIC_DRAW:GL_DYNAMIC_DRAW);
|
||||
|
||||
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,sizeof(Vertex),(void*)0);
|
||||
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,size,(void*)0);
|
||||
glEnableVertexAttribArray(0);
|
||||
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,sizeof(Vertex),(void*)(offsetof(Vertex,norm)));
|
||||
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,size,(void*)(offsetof(Vertex,norm)));
|
||||
glEnableVertexAttribArray(1);
|
||||
glVertexAttribPointer(2,2,GL_FLOAT,GL_FALSE,sizeof(Vertex),(void*)(offsetof(Vertex,uv)));
|
||||
glVertexAttribPointer(2,2,GL_FLOAT,GL_FALSE,size,(void*)(offsetof(Vertex,uv)));
|
||||
glEnableVertexAttribArray(2);
|
||||
glVertexAttribPointer(3,3,GL_FLOAT,GL_FALSE,sizeof(Vertex),(void*)(offsetof(Vertex,tan)));
|
||||
glVertexAttribPointer(3,3,GL_FLOAT,GL_FALSE,size,(void*)(offsetof(Vertex,tan)));
|
||||
glEnableVertexAttribArray(3);
|
||||
glVertexAttribPointer(4,3,GL_FLOAT,GL_FALSE,sizeof(Vertex),(void*)(offsetof(Vertex,biTan)));
|
||||
glVertexAttribPointer(4,3,GL_FLOAT,GL_FALSE,size,(void*)(offsetof(Vertex,biTan)));
|
||||
glEnableVertexAttribArray(4);
|
||||
glVertexAttribPointer(5,4,GL_FLOAT,GL_FALSE,size,(void*)(offsetof(Vertex,weights)));
|
||||
//glEnableVertexArrayAttrib(VAO,5);
|
||||
glEnableVertexAttribArray(5);
|
||||
//glVertexAttribDivisor(5,1);
|
||||
for(int i=0;i<numVertexGroups;i++){
|
||||
}
|
||||
}
|
||||
|
||||
void Mesh::update(){
|
||||
@@ -158,19 +170,60 @@ namespace vb01{
|
||||
|
||||
material->update();
|
||||
Shader *shader=material->getShader();
|
||||
|
||||
shader->setBool(castShadow,"castShadow");
|
||||
shader->setBool(skeleton,"animated");
|
||||
shader->setBool(false,"environment");
|
||||
shader->setMat4(view,"view");
|
||||
shader->setMat4(proj,"proj");
|
||||
shader->setVec3(camPos,"camPos");
|
||||
shader->setMat4(model,"model");
|
||||
|
||||
if(skeleton){
|
||||
shader->editShader(Shader::VERTEX_SHADER,2,"const int numBones="+to_string(skeleton->getNumBones())+";");
|
||||
shader->editShader(Shader::VERTEX_SHADER,3,"const int numVertGroups="+to_string(numVertexGroups)+";");
|
||||
|
||||
Node *modelNode = skeleton->getRootBone()->getParent();
|
||||
for(int i=0;i<skeleton->getNumBones();i++){
|
||||
Bone *bone = skeleton->getBone(i), *parent = (Bone*)bone->getParent();
|
||||
Vector3 boneAxis[]{
|
||||
bone->getInitAxis(0),
|
||||
bone->getInitAxis(1),
|
||||
bone->getInitAxis(2)
|
||||
};
|
||||
Vector3 posePos = bone->getPosePos();
|
||||
Quaternion poseRot = bone->getPoseRot();
|
||||
Vector3 trans = boneAxis[0]*posePos.x+boneAxis[1]*posePos.y+boneAxis[2]*posePos.z;
|
||||
Vector3 scale = bone->getPoseScale();
|
||||
Vector3 bonePos = (bone->getRestPos());
|
||||
//bonePos = modelNode->globalToLocalPosition(bonePos);
|
||||
|
||||
int vertGroupId = -1,parentId = -1;
|
||||
for(int j=0;j<numVertexGroups;j++)
|
||||
if(bone->getName() == vertexGroups[j])
|
||||
vertGroupId = j;
|
||||
for(int j = 0;j < skeleton->getNumBones();j++)
|
||||
if(skeleton->getBone(j) == parent){
|
||||
parentId = j;
|
||||
break;
|
||||
}
|
||||
|
||||
shader->setVec3(bonePos,"bones["+to_string(i)+"].pos");
|
||||
shader->setVec3(trans,"bones["+to_string(i)+"].trans");
|
||||
shader->setVec3(poseRot.getAxis(),"bones["+to_string(i)+"].rotAxis");
|
||||
shader->setFloat(poseRot.getAngle(),"bones["+to_string(i)+"].angle");
|
||||
shader->setVec3(scale,"bones["+to_string(i)+"].scale");
|
||||
shader->setInt(vertGroupId,"bones["+to_string(i)+"].vertGroup");
|
||||
shader->setInt(parentId,"bones["+to_string(i)+"].parent");
|
||||
}
|
||||
}
|
||||
|
||||
if(reflect){
|
||||
shader->setBool(reflect,"environmentMapEnabled");
|
||||
root->getSkybox()->getMaterial()->getDiffuseMap(0)->select(4);
|
||||
environmentMap->select(4);
|
||||
}
|
||||
if(skeleton){
|
||||
}
|
||||
|
||||
if(material->getType()==Material::MATERIAL_GUI){
|
||||
shader->setVec2(Vector2((float)width,(float)height),"screen");
|
||||
if(node)
|
||||
@@ -191,24 +244,4 @@ namespace vb01{
|
||||
glPolygonMode(GL_FRONT_AND_BACK,wireframe?GL_LINE:GL_FILL);
|
||||
glDrawElements(GL_TRIANGLES,3*numTris,GL_UNSIGNED_INT,0);
|
||||
}
|
||||
|
||||
Mesh::VertexGroup& Mesh::getVertexGroup(string name){
|
||||
int id=-1;
|
||||
for(int i=0;i<numVertexGroups;i++)
|
||||
if(groups[i].name==name){
|
||||
id=i;
|
||||
break;
|
||||
}
|
||||
return groups[id];
|
||||
}
|
||||
|
||||
Mesh::ShapeKey& Mesh::getShapeKey(string name){
|
||||
int id=-1;
|
||||
for(int i=0;i<numVertexGroups;i++)
|
||||
if(shapeKeys[i].name==name){
|
||||
id=i;
|
||||
break;
|
||||
}
|
||||
return shapeKeys[id];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user