Working with obj model format

This commit is contained in:
Vladislav Khorev 2025-02-22 21:35:08 +03:00
parent 21301652ce
commit 476a1e23f7
7 changed files with 1295 additions and 34 deletions

View File

@ -36,6 +36,9 @@ namespace ZL
VertexDataStruct colorCubeMesh;
VertexRenderStruct colorCubeMeshMutable;
VertexDataStruct testObjMesh;
VertexRenderStruct testObjMeshMutable;
}

2
Game.h
View File

@ -108,5 +108,7 @@ namespace ZL
extern VertexDataStruct colorCubeMesh;
extern VertexRenderStruct colorCubeMeshMutable;
extern VertexDataStruct testObjMesh;
extern VertexRenderStruct testObjMeshMutable;
}
}

1208
ObjLoader.cpp Normal file

File diff suppressed because it is too large Load Diff

5
ObjLoader.h Normal file
View File

@ -0,0 +1,5 @@
#pragma once
#include "Renderer.h"
ZL::VertexDataStruct LoadFromObjFile(const std::string& fileName);

View File

@ -274,31 +274,46 @@ namespace ZL {
}
}
void VertexRenderStruct::RotateByMatrix(Matrix3f m)
void VertexDataStruct::Scale(float scale)
{
for (int i = 0; i < PositionData.size(); i++)
{
PositionData[i] = PositionData[i] * scale;
}
}
void VertexDataStruct::SwapZandY()
{
for (int i = 0; i < PositionData.size(); i++)
{
auto value = PositionData[i].v[1];
PositionData[i].v[1] = PositionData[i].v[2];
PositionData[i].v[2] = value;
}
}
void VertexDataStruct::RotateByMatrix(Matrix3f m)
{
for (int i = 0; i < data.PositionData.size(); i++)
for (int i = 0; i < PositionData.size(); i++)
{
data.PositionData[i] = MultVectorMatrix(data.PositionData[i], m);
PositionData[i] = MultVectorMatrix(PositionData[i], m);
}
for (int i = 0; i < data.NormalData.size(); i++)
for (int i = 0; i < NormalData.size(); i++)
{
data.NormalData[i] = MultVectorMatrix(data.NormalData[i], m);
NormalData[i] = MultVectorMatrix(NormalData[i], m);
}
for (int i = 0; i < data.TangentData.size(); i++)
for (int i = 0; i < TangentData.size(); i++)
{
data.TangentData[i] = MultVectorMatrix(data.TangentData[i], m);
TangentData[i] = MultVectorMatrix(TangentData[i], m);
}
for (int i = 0; i < data.BinormalData.size(); i++)
for (int i = 0; i < BinormalData.size(); i++)
{
data.BinormalData[i] = MultVectorMatrix(data.BinormalData[i], m);
BinormalData[i] = MultVectorMatrix(BinormalData[i], m);
}
RefreshVBO();
}
void VertexRenderStruct::AssignFrom(const VertexDataStruct& v)

View File

@ -48,6 +48,11 @@ namespace ZL {
std::vector<Vector3f> TangentData;
std::vector<Vector3f> BinormalData;
std::vector<Vector3f> ColorData;
void RotateByMatrix(Matrix3f m);
void Scale(float scale);
void SwapZandY();
};
struct VertexRenderStruct
@ -63,8 +68,6 @@ namespace ZL {
std::shared_ptr<VBOHolder> colorVBO;
void RefreshVBO();
void RotateByMatrix(Matrix3f m);
void AssignFrom(const VertexDataStruct& v);
};

View File

@ -1,6 +1,7 @@
#include "TextureManager.h"
#include "ShaderManager.h"
#include "Renderer.h"
#include "ObjLoader.h"
#include "Physics.h"
#include <string>
@ -131,6 +132,40 @@ namespace ZL
glViewport(0, 0, Env::width, Env::height);
renderer.shaderManager.PushShader(defaultShaderName);
renderer.RenderUniform1i(textureUniformName, 0);
renderer.EnableVertexAttribArray(vPositionName);
renderer.EnableVertexAttribArray(vTexCoordName);
renderer.PushPerspectiveProjectionMatrix(1.0 / 6.0, static_cast<float>(Env::width) / static_cast<float>(Env::height), 1, 1000);
renderer.PushMatrix();
renderer.LoadIdentity();
renderer.TranslateMatrix({ 0,0, -100 });
renderer.RotateMatrix(QuatFromRotateAroundX(-M_PI / 3.0));
GameObjects::testObjMeshMutable.AssignFrom(GameObjects::testObjMesh);
GameObjects::testObjMeshMutable.data.RotateByMatrix(QuatToMatrix(QuatFromRotateAroundZ(gs.rotateTimer * M_PI / 3.0)));
GameObjects::testObjMeshMutable.RefreshVBO();
glBindTexture(GL_TEXTURE_2D, GameObjects::backgroundTexturePtr->getTexID());
renderer.DrawVertexRenderStruct(GameObjects::testObjMeshMutable);
renderer.PopMatrix();
renderer.PopProjectionMatrix();
renderer.DisableVertexAttribArray(vColorName);
renderer.DisableVertexAttribArray(vTexCoordName);
renderer.shaderManager.PopShader();
/*
renderer.shaderManager.PushShader(colorShaderName);
//renderer.RenderUniform1i(textureUniformName, 0);
@ -140,44 +175,28 @@ namespace ZL
renderer.EnableVertexAttribArray(vColorName);
renderer.PushPerspectiveProjectionMatrix(1.0 / 6.0, static_cast<float>(Env::width)/ static_cast<float>(Env::height), 10, 10000);
renderer.PushMatrix();
renderer.LoadIdentity();
//renderer.RotateMatrix(QuatFromRotateAroundZ(gs.rotateTimer * M_PI / 3.0));
renderer.TranslateMatrix({ 0,0, -1000 });
//
renderer.RotateMatrix(QuatFromRotateAroundX(-M_PI / 3.0));
GameObjects::colorCubeMeshMutable.AssignFrom(GameObjects::colorCubeMesh);
GameObjects::colorCubeMeshMutable.RotateByMatrix(QuatToMatrix(QuatFromRotateAroundZ(gs.rotateTimer * M_PI / 3.0)));
renderer.DrawVertexRenderStruct(GameObjects::colorCubeMeshMutable);
renderer.PopMatrix();
/*
DrawBackground();
DrawPipes();
DrawBird();
DrawUi();*/
renderer.PopProjectionMatrix();
renderer.DisableVertexAttribArray(vColorName);
renderer.DisableVertexAttribArray(vPositionName);
renderer.shaderManager.PopShader();
renderer.shaderManager.PopShader();*/
CheckGlError();
@ -232,7 +251,7 @@ namespace ZL
//Load shaders:
renderer.shaderManager.AddShaderFromFiles("default", "./default.vertex", "./default.fragment");
renderer.shaderManager.AddShaderFromFiles("defaultColor", "./defaultColor.vertex", "./defaultColor.fragment");
//Load textures
GameObjects::birdTexturePtr = std::make_shared<Texture>(CreateTextureDataFromBmp32("./bird.bmp32"));
GameObjects::backgroundTexturePtr = std::make_shared<Texture>(CreateTextureDataFromBmp24("./background.bmp"));
@ -271,6 +290,12 @@ namespace ZL
GameObjects::colorCubeMeshMutable.data = CreateCube3D(5.0);
GameObjects::colorCubeMeshMutable.RefreshVBO();
GameObjects::testObjMesh = LoadFromObjFile("./chair_01.obj");
GameObjects::testObjMesh.Scale(10);
GameObjects::testObjMesh.SwapZandY();
GameObjects::testObjMeshMutable.data = GameObjects::testObjMesh;
GameObjects::testObjMeshMutable.RefreshVBO();
//Set some game values
Env::birdStartPos = { Env::width * 0.2f, Env::getActualClientHeight() * 0.5f };