Browse Source

完成Model类大部分方法,剩下Draw

master
blobt 4 years ago
parent
commit
86c6e31f13
  1. 171
      model.cpp
  2. 47
      model.h
  3. 2
      renderFramework.vcxproj
  4. 6
      renderFramework.vcxproj.filters

171
model.cpp

@ -0,0 +1,171 @@
#include "model.h"
#include "utils.h"
Model::Model()
{
mShader = new Shader;
}
void Model::Init(const char*modelPath) {
int nFileSize = 0;
fileContent = LoadFileContent(modelPath, nFileSize);
if (fileContent == nullptr) {
printf("load obj model fail\n");
exit;
}
//解析模型数据
parseModel();
delete fileContent;
//填充VertexBuffer
createVertexBuffer();
}
void Model::parseModel()
{
std::stringstream ssObjFile((char*)fileContent);
char szOneLine[256];
while (!ssObjFile.eof()) {
memset(szOneLine, 0, 256);
ssObjFile.getline(szOneLine, 256);
if (strlen(szOneLine) > 0) {
parseLine(szOneLine);
}
}
}
void Model::parseLine(const char * line)
{
if (line[0] == 'v') {
if (line[1] == 't') {
parseTexcoord(line);
}
else if (line[1] == 'n') {
parseNormal(line);
}
else {
parsePosition(line);
}
}
if (line[0] == 'f') {
parseFace(line);
}
}
void Model::parseTexcoord(const char * line)
{
glm::float3 f3 = parseFloat(line);
texcoord.push_back(f3);
}
void Model::parseNormal(const char * line)
{
glm::float3 f3 = parseFloat(line);
normal.push_back(f3);
}
void Model::parsePosition(const char * line)
{
glm::float3 f3 = parseFloat(line);
position.push_back(f3);
}
glm::float3 Model::parseFloat(const char * line)
{
std::string t;
std::stringstream ssOneLine(line);
ssOneLine >> t;
glm::float3 f3;
ssOneLine >> f3.x;
ssOneLine >> f3.y;
if (line[1] == 't') {
f3.z = 0;
}
else {
ssOneLine >> f3.z;
}
return f3;
}
void Model::parseFace(const char * line)
{
std::string temp;
std::stringstream ssOneLine(line);
ssOneLine >> temp; //去除 f
std::string pointerIndexStr;
for (int i = 0; i < 3; i++) {
//解析每一个点
ssOneLine >> pointerIndexStr;
VertexIndex vi = parseVertexIndex(pointerIndexStr);
//把点加到vertices
int index = addVertices(vi);
}
}
VertexIndex Model::parseVertexIndex(std::string pointStr)
{
size_t pos = pointStr.find_first_of('/');
std::string positionIndexStr = pointStr.substr(0, pos);
size_t pos2 = pointStr.find_first_of('/', pos + 1);
std::string texcoordIndexStr = pointStr.substr(pos + 1, pos2 - pos - 1);
std::string normalIndexStr = pointStr.substr(pos2 + 1, pointStr.length() - pos2 - 1);
VertexIndex ret;
ret.position = atoi(positionIndexStr.c_str()) - 1;
ret.texcoord = atoi(texcoordIndexStr.c_str()) - 1;
ret.normal = atoi(normalIndexStr.c_str()) - 1;
return ret;
}
int Model::addVertices(VertexIndex indexes)
{
int currentIndex = -1;
size_t currentVerticeCount = vertices.size();
currentIndex = vertices.size();
vertices.push_back(indexes);
return currentIndex;
}
void Model::createVertexBuffer()
{
int vertexCount = (int)vertices.size();
mVertexBuffer = new VertexBuffer;
glm::float3 t;
mVertexBuffer->SetSize(vertexCount);
for (int i = 0; i < vertexCount; ++i) {
t = position[vertices[i].position - 1];
mVertexBuffer->SetPosition(i, t[0], t[1], t[2]);
t = texcoord[vertices[i].texcoord - 1];
mVertexBuffer->SetTexcoord(i, t[0], t[1]);
t = normal[vertices[i].normal - 1];
mVertexBuffer->SetNormal(i, t[0], t[1], t[2]);
}
}
void Model::Draw(glm::mat4 & viewMatrix, glm::mat4 projectionMatrix, float x, float y, float z) {
//TODO
}
void Model::SetPosition(float x, float y, float z) {
mModelMatrix = glm::translate(x, y, z);
}
void Model::SetAmbientMaterial(float r, float g, float b, float a) {
mShader->SetVec4("U_AmbientMaterial", r, g, b, a);
}
void Model::SetDiffuseMaterial(float r, float g, float b, float a) {
mShader->SetVec4("U_DiffuseMaterial", r, g, b, a);
}
void Model::SetSpecularMaterial(float r, float g, float b, float a) {
mShader->SetVec4("U_SpecularMaterial", r, g, b, a);
}
void Model::SetTexture(const char*imagePath) {
mShader->SetTexture("U_Texture", imagePath);
}

47
model.h

@ -0,0 +1,47 @@
#pragma once
#include "ggl.h"
#include "vertexbuffer.h"
#include "shader.h"
#include <vector>
#include "Glm/glm.hpp"
#include "Glm/ext.hpp"
struct VertexIndex
{
int position;
int texcoord;
int normal;
};
class Model {
public:
VertexBuffer* mVertexBuffer;
Shader* mShader;
public:
glm::mat4 mModelMatrix;
float *mLightViewMatrix, *mLightProjectionMatrix;
Model();
void Init(const char *modelPath);
void Draw(glm::mat4 &viewMatrix, glm::mat4 projectionMatrix, float x, float y, float z);
void SetPosition(float x, float y, float z);
void SetAmbientMaterial(float r, float g, float b, float a);
void SetDiffuseMaterial(float r, float g, float b, float a);
void SetSpecularMaterial(float r, float g, float b, float a);
void SetTexture(const char*imagePath);
private:
unsigned char* fileContent = nullptr;
std::vector<glm::float3> position;
std::vector<glm::float3> texcoord;
std::vector<glm::float3> normal;
std::vector<VertexIndex> vertices;
void parseModel();
void parseLine(const char* line);
glm::float3 parseFloat(const char* line);
VertexIndex parseVertexIndex(std::string pointStr);
int addVertices(VertexIndex indexes);
void parseTexcoord(const char* line);
void parseNormal(const char* line);
void parsePosition(const char* line);
void parseFace(const char* line);
void createVertexBuffer();
};

2
renderFramework.vcxproj

@ -127,6 +127,7 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="main.cpp" />
<ClCompile Include="model.cpp" />
<ClCompile Include="scene.cpp" />
<ClCompile Include="shader.cpp" />
<ClCompile Include="utils.cpp" />
@ -134,6 +135,7 @@
</ItemGroup>
<ItemGroup>
<ClInclude Include="ggl.h" />
<ClInclude Include="model.h" />
<ClInclude Include="scene.h" />
<ClInclude Include="shader.h" />
<ClInclude Include="utils.h" />

6
renderFramework.vcxproj.filters

@ -30,6 +30,9 @@
<ClCompile Include="shader.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="model.cpp">
<Filter>源文件</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="ggl.h">
@ -47,5 +50,8 @@
<ClInclude Include="shader.h">
<Filter>源文件</Filter>
</ClInclude>
<ClInclude Include="model.h">
<Filter>源文件</Filter>
</ClInclude>
</ItemGroup>
</Project>
Loading…
Cancel
Save