rlgl animation working, not using the internal ray animation system

This commit is contained in:
Jip 2024-05-06 16:26:39 +02:00
parent e9a1c6073c
commit 88430a890a

View file

@ -135,8 +135,8 @@ static Mesh CreateMesh(const Mesh_t& tso_mesh)
ray_mesh.texcoords[j * 2 + 1] = -tso_mesh.TransformedVertexData[j].TextureCoord.v; ray_mesh.texcoords[j * 2 + 1] = -tso_mesh.TransformedVertexData[j].TextureCoord.v;
//normals //normals
ray_mesh.normals[j * 3 + 0] = tso_mesh.TransformedVertexData[j].NormalCoord.x; ray_mesh.normals[j * 3 + 0] = tso_mesh.TransformedVertexData[j].NormalCoord.x;
ray_mesh.normals[j * 3 + 0] = tso_mesh.TransformedVertexData[j].NormalCoord.y; ray_mesh.normals[j * 3 + 1] = tso_mesh.TransformedVertexData[j].NormalCoord.y;
ray_mesh.normals[j * 3 + 0] = tso_mesh.TransformedVertexData[j].NormalCoord.z; ray_mesh.normals[j * 3 + 2] = tso_mesh.TransformedVertexData[j].NormalCoord.z;
} }
//indices //indices
for (unsigned j = 0; j < ray_mesh.triangleCount; j++) for (unsigned j = 0; j < ray_mesh.triangleCount; j++)
@ -151,7 +151,7 @@ static Mesh CreateMesh(const Mesh_t& tso_mesh)
} }
// Upload mesh data from CPU (RAM) to GPU (VRAM) memory // Upload mesh data from CPU (RAM) to GPU (VRAM) memory
UploadMesh(&ray_mesh, true); //check the dynamic flag if we have to keep creating the mesh //UploadMesh(&ray_mesh, true); //check the dynamic flag if we have to keep creating the mesh
return ray_mesh; return ray_mesh;
} }
@ -227,27 +227,28 @@ static void TransformVertices(Bone_t& Bone)
} }
if(BoneIndex < Mesh.BindingCount){ if(BoneIndex < Mesh.BindingCount){
for(unsigned i=0; i<Mesh.BoneBindings[BoneIndex].RealVertexCount; i++){ for(unsigned i=0; i<Mesh.BoneBindings[BoneIndex].RealVertexCount; i++)
{
unsigned VertexIndex = Mesh.BoneBindings[BoneIndex].FirstRealVertex + i; unsigned VertexIndex = Mesh.BoneBindings[BoneIndex].FirstRealVertex + i;
Vertex_t& RelativeVertex = Mesh.VertexData[VertexIndex]; Vertex_t& RelativeVertex = Mesh.VertexData[VertexIndex];
Vertex_t& AbsoluteVertex = Mesh.TransformedVertexData[VertexIndex]; Vertex_t& AbsoluteVertex = Mesh.TransformedVertexData[VertexIndex];
rlTranslatef(RelativeVertex.Coord.x, RelativeVertex.Coord.y, RelativeVertex.Coord.z); rlTranslatef(RelativeVertex.Coord.x, RelativeVertex.Coord.y, RelativeVertex.Coord.z);
const Matrix matModelView = rlGetMatrixModelview(); const Matrix matModelView = rlGetMatrixTransform();
const Vector3 vertex = Vector3Transform(Vector3{ 0.f, 0.f, 0.f }, matModelView); const Vector3 vertex = Vector3Transform(Vector3{ 0.f, 0.f, 0.f }, matModelView);
AbsoluteVertex.Coord.x = vertex.x; AbsoluteVertex.Coord.x = vertex.x;
AbsoluteVertex.Coord.y = vertex.y; AbsoluteVertex.Coord.y = vertex.y;
AbsoluteVertex.Coord.z = vertex.z; AbsoluteVertex.Coord.z = vertex.z;
rlTranslatef(-RelativeVertex.Coord.x, -RelativeVertex.Coord.y, -RelativeVertex.Coord.z); rlTranslatef(-RelativeVertex.Coord.x, -RelativeVertex.Coord.y, -RelativeVertex.Coord.z);
} }
for(unsigned i=0; i<Mesh.BoneBindings[BoneIndex].BlendVertexCount; i++){ for(unsigned i=0; i<Mesh.BoneBindings[BoneIndex].BlendVertexCount; i++)
{
unsigned VertexIndex = Mesh.RealVertexCount + Mesh.BoneBindings[BoneIndex].FirstBlendVertex + i; unsigned VertexIndex = Mesh.RealVertexCount + Mesh.BoneBindings[BoneIndex].FirstBlendVertex + i;
Vertex_t& RelativeVertex = Mesh.VertexData[VertexIndex]; Vertex_t& RelativeVertex = Mesh.VertexData[VertexIndex];
Vertex_t& AbsoluteVertex = Mesh.TransformedVertexData[VertexIndex]; Vertex_t& AbsoluteVertex = Mesh.TransformedVertexData[VertexIndex];
rlTranslatef(RelativeVertex.Coord.x, RelativeVertex.Coord.y, RelativeVertex.Coord.z); rlTranslatef(RelativeVertex.Coord.x, RelativeVertex.Coord.y, RelativeVertex.Coord.z);
const Matrix matModelView = rlGetMatrixModelview(); const Matrix matModelView = rlGetMatrixTransform();
const Vector3 vertex = Vector3Transform(Vector3{ 0.f, 0.f, 0.f }, matModelView); const Vector3 vertex = Vector3Transform(Vector3{ 0.f, 0.f, 0.f }, matModelView);
AbsoluteVertex.Coord.x = vertex.x; AbsoluteVertex.Coord.x = vertex.x;
AbsoluteVertex.Coord.y = vertex.y; AbsoluteVertex.Coord.y = vertex.y;
@ -271,7 +272,8 @@ static void BlendVertices()
{ {
for(unsigned i=0; i<MeshCount; i++){ for(unsigned i=0; i<MeshCount; i++){
Mesh_t& Mesh = Meshes[i]; Mesh_t& Mesh = Meshes[i];
for(unsigned i=0; i<Mesh.BlendVertexCount; i++){ for(unsigned i=0; i<Mesh.BlendVertexCount; i++)
{
Vertex_t& BlendVertex = Mesh.TransformedVertexData[Mesh.RealVertexCount + i]; Vertex_t& BlendVertex = Mesh.TransformedVertexData[Mesh.RealVertexCount + i];
float Weight = BlendVertex.BlendData.Weight; float Weight = BlendVertex.BlendData.Weight;
Vertex_t& RealVertex = Mesh.TransformedVertexData[BlendVertex.BlendData.OtherVertex]; Vertex_t& RealVertex = Mesh.TransformedVertexData[BlendVertex.BlendData.OtherVertex];
@ -297,6 +299,47 @@ static void CreateMeshes()
} }
} }
static void UpdateMeshes(Model& model)
{
rlPushMatrix();
rlLoadIdentity();
TransformVertices(Skeleton.Bones[0]);
rlPopMatrix();
BlendVertices();
for (unsigned i = 0; i < MeshCount; i++)
{
Mesh& ray_mesh = model.meshes[i];
Mesh_t& tso_mesh = Meshes[i];
//vertex data
for (unsigned j = 0; j < ray_mesh.vertexCount; j++)
{
//vertices?
ray_mesh.vertices[j * 3 + 0] = tso_mesh.TransformedVertexData[j].Coord.x;
ray_mesh.vertices[j * 3 + 1] = tso_mesh.TransformedVertexData[j].Coord.y;
ray_mesh.vertices[j * 3 + 2] = tso_mesh.TransformedVertexData[j].Coord.z;
//coords
ray_mesh.texcoords[j * 2 + 0] = tso_mesh.TransformedVertexData[j].TextureCoord.u;
ray_mesh.texcoords[j * 2 + 1] = -tso_mesh.TransformedVertexData[j].TextureCoord.v;
//normals
ray_mesh.normals[j * 3 + 0] = tso_mesh.TransformedVertexData[j].NormalCoord.x;
ray_mesh.normals[j * 3 + 1] = tso_mesh.TransformedVertexData[j].NormalCoord.y;
ray_mesh.normals[j * 3 + 2] = tso_mesh.TransformedVertexData[j].NormalCoord.z;
}
// from UploadMesh
//mesh->vboId[0] = 0; // Vertex buffer: positions
//mesh->vboId[1] = 0; // Vertex buffer: texcoords
//mesh->vboId[2] = 0; // Vertex buffer: normals
UpdateMeshBuffer(ray_mesh, 0, ray_mesh.vertices, sizeof(float) * ray_mesh.vertexCount * 3, 0);
UpdateMeshBuffer(ray_mesh, 1, ray_mesh.texcoords, sizeof(float) * ray_mesh.vertexCount * 2, 0);
UpdateMeshBuffer(ray_mesh, 2, ray_mesh.normals, sizeof(float) * ray_mesh.vertexCount * 3, 0);
}
rlPopMatrix();
}
static void DrawMeshes() static void DrawMeshes()
{ {
rlPushMatrix(); rlPushMatrix();
@ -457,23 +500,21 @@ static Model LoadModelTSO()
ray_mesh.indices = (unsigned short*)RL_CALLOC(ray_mesh.triangleCount * 3, sizeof(unsigned short)); ray_mesh.indices = (unsigned short*)RL_CALLOC(ray_mesh.triangleCount * 3, sizeof(unsigned short));
// Process all mesh faces // Process all mesh faces
// TODO: extract this in seperate function
//vertex data //vertex data
for (unsigned j = 0; j < ray_mesh.vertexCount; j++) for (unsigned j = 0; j < ray_mesh.vertexCount; j++)
{ {
//vertices? //vertices?
//ray_mesh.vertices[j * 3 + 0] = tso_mesh.TransformedVertexData[j].Coord.x; ray_mesh.vertices[j * 3 + 0] = tso_mesh.TransformedVertexData[j].Coord.x;
//ray_mesh.vertices[j * 3 + 1] = tso_mesh.TransformedVertexData[j].Coord.y; ray_mesh.vertices[j * 3 + 1] = tso_mesh.TransformedVertexData[j].Coord.y;
//ray_mesh.vertices[j * 3 + 2] = tso_mesh.TransformedVertexData[j].Coord.z; ray_mesh.vertices[j * 3 + 2] = tso_mesh.TransformedVertexData[j].Coord.z;
ray_mesh.vertices[j * 3 + 0] = tso_mesh.VertexData[j].Coord.x;
ray_mesh.vertices[j * 3 + 1] = tso_mesh.VertexData[j].Coord.y;
ray_mesh.vertices[j * 3 + 2] = tso_mesh.VertexData[j].Coord.z; //offset for now so we can see them
//coords //coords
ray_mesh.texcoords[j * 2 + 0] = tso_mesh.TransformedVertexData[j].TextureCoord.u; ray_mesh.texcoords[j * 2 + 0] = tso_mesh.TransformedVertexData[j].TextureCoord.u;
ray_mesh.texcoords[j * 2 + 1] = -tso_mesh.TransformedVertexData[j].TextureCoord.v; ray_mesh.texcoords[j * 2 + 1] = -tso_mesh.TransformedVertexData[j].TextureCoord.v;
//normals //normals
ray_mesh.normals[j * 3 + 0] = tso_mesh.TransformedVertexData[j].NormalCoord.x; ray_mesh.normals[j * 3 + 0] = tso_mesh.TransformedVertexData[j].NormalCoord.x;
ray_mesh.normals[j * 3 + 0] = tso_mesh.TransformedVertexData[j].NormalCoord.y; ray_mesh.normals[j * 3 + 1] = tso_mesh.TransformedVertexData[j].NormalCoord.y;
ray_mesh.normals[j * 3 + 0] = tso_mesh.TransformedVertexData[j].NormalCoord.z; ray_mesh.normals[j * 3 + 2] = tso_mesh.TransformedVertexData[j].NormalCoord.z;
} }
//indices //indices
for (unsigned j = 0; j < ray_mesh.triangleCount; j++) for (unsigned j = 0; j < ray_mesh.triangleCount; j++)
@ -543,8 +584,6 @@ int main(void)
assert( LoadMeshes() ); assert( LoadMeshes() );
CreateMeshes(); CreateMeshes();
TransformVertices(Skeleton.Bones[0]);
BlendVertices();
Model model = LoadModelTSO(); Model model = LoadModelTSO();
printf("======================================\n"); printf("======================================\n");
@ -577,7 +616,8 @@ int main(void)
if (IsKeyDown(KEY_N)) { AdvanceFrame(Skeleton, Animation, dt); } if (IsKeyDown(KEY_N)) { AdvanceFrame(Skeleton, Animation, dt); }
} }
//rlClearScreenBuffers(); //Clear the screen and the depth buffer rlClearScreenBuffers(); //Clear the screen and the depth buffer
UpdateMeshes(model);
BeginDrawing(); BeginDrawing();
{ {
@ -585,15 +625,11 @@ int main(void)
BeginMode3D(camera); BeginMode3D(camera);
{ {
DrawGrid(10, 5.0f); DrawGrid(10, 5.0f);
//Avatar //Avatar
{ {
if (ShowMesh) if (ShowMesh)
{ {
//rlEnableWireMode(); // draw the model
//rlColor3f(1.0, 1.0, 1.0);
//DrawMeshes();
//rlDisableWireMode();
const Vector3 position{ 0.0f, 0.0f, 0.0f }; const Vector3 position{ 0.0f, 0.0f, 0.0f };
const float scale = 1.f; const float scale = 1.f;
DrawModel(model, position, scale, WHITE); DrawModel(model, position, scale, WHITE);