There’s is a error with my obj load/render that I can’t solve
I’m a newbie in directx 9, I’m trying to do this in the best way
The model is not displayed properly, do not know if this correct model loading
There is my obj load code:
#pragma once
struct Vertex { float X, Y, Z; };
struct TextureCoor { float TU, TV; };
struct Normals { float X, Y, Z; };
struct Propiedades
{
char* mtllibName[50];
Vertex * v;
TextureCoor* vt;
Normals* vn;
int vSize, vtSize, vnSize;
};
struct Grupo
{
char names[10];
Propiedades pro;
};
class ObjLoad
{
// Grupo * gru;
Vertex * vertex;
TextureCoor * vt;
Normals * normals ;
int vertex_size;
int indices_size;
short *indicesData;
public:
ObjLoad();
~ObjLoad();
int indicesSize() { return indices_size; }
short* getIndices() { return indicesData; }
Vertex* getVertex() { return vertex; }
int getVertexSize() { return vertex_size; }
bool Load(char* name);
void Clean();
};
CPP:
#include "stdafx.h"
#include "ObjLoad.h"
#include<vector>
void CleanGrupo(Grupo*g)
{
if(!g) return;
if(g->pro.v)
delete[] g->pro.v;
if(g->pro.vt)
delete[] g->pro.vt;
if(g->pro.vn)
delete[] g->pro.vn;
if (g)
{
g=0;
delete g;
}
}
void CalculateSize(FILE*f, int &temp_VertexSize, int &temp_Face, int &temp_TextureCoords, int &temp_Grupos, int&temp_Normals)
{
char buffer[20];
fpos_t pos;
fgetpos(f,&pos);
while (true)
{
// if (feof(f)) break;
if(temp_Grupos > 1 || feof(f))
break;
fgets(buffer, 20, f);
if (buffer[0] == 'v' && buffer[1] == ' ')
{
temp_VertexSize++;
}
else if (buffer[0] == 'v' && buffer[1] == 't')
{
temp_TextureCoords++;
}
else if (buffer[0] == 'v' && buffer[1] == 'n')
{
temp_Normals++;
}
else if (buffer[0] == 'f' && buffer[1] == ' ')
{
temp_Face++;
}
else if (buffer[0] == 'g' && buffer[1] == ' ')
{
temp_Grupos++;
}
}
fsetpos(f, &pos);
}
ObjLoad::ObjLoad()
{
vertex=0;
normals=0;
vt=0;
// gru = 0;
}
ObjLoad::~ObjLoad()
{
if(vertex)
delete[] vertex;
if(normals)
delete[] normals;
if(vt)
delete[] vt;
// CleanGrupo(gru);
}
/*
bool ObjLoad::Load2(char* name)
{
if (!name && strlen(name) < 0) return false;
FILE *f = fopen(name, "r");
if (!f) return false;
int temp_VertexSize = 0;
int temp_Face = 0;
int temp_TextureCoords = 0;
int temp_Normals = 0;
int temp_Grupos = 0;
char buffer[20];
while (true)
{
if (feof(f)) break;
fgets(buffer, 20, f);
if (buffer[0] == 'g' && buffer[1] == ' ')
{
temp_Grupos++;
}
}
// temp_Grupos--;
gru = new Grupo[temp_Grupos];
gru[0].pro.v = 0;
gru[0].pro.vt = 0;
gru[0].pro.vn = 0;
rewind(f);
ZeroMemory(buffer, strlen(buffer));
fpos_t pos;
int vertexPos = 0;
int texturePos = 0;
int normalsPos = 0;
int gro_index = -1;
printf("%dn",temp_Grupos);
while (true)
{
if(feof(f)) break;
fgetpos(f,&pos);
fgets(buffer, 20, f);
if (buffer[0] == 'g' && buffer[1] == ' ')
{
gro_index++;
//gro_index;
texturePos =0;
vertexPos=0;
normalsPos=0;
temp_VertexSize = 0;
temp_Face = 0;
temp_TextureCoords = 0;
temp_Normals = 0;
temp_Grupos = 0;
CalculateSize(f, temp_VertexSize, temp_Face, temp_TextureCoords, temp_Grupos, temp_Normals);
gru[gro_index].pro.v = new Vertex[temp_VertexSize];
gru[gro_index].pro.vn = new Normals[temp_Normals];
gru[gro_index].pro.vt = new TextureCoor[temp_TextureCoords];
gru[gro_index].pro.vSize = temp_VertexSize;
gru[gro_index].pro.vtSize = temp_TextureCoords;
gru[gro_index].pro.vnSize= temp_Normals;
fsetpos(f, &pos);
fscanf(f, "g %s", gru[gro_index].names);
// printf("%sn", gru[gro_index].names);
}
else if (strstr(buffer, "mtllib"))
{
fsetpos(f, &pos);
fscanf(f, "mtllib %s", gru[gro_index].pro.mtllibName);
}
else if (buffer[0] == 'v')
{
if(gro_index == -1) continue;
if (buffer[1] == ' ')
{
fsetpos(f, &pos);
fscanf(f, "v %f %f %f", &gru[gro_index].pro.v[vertexPos].X,
&gru[gro_index].pro.v[vertexPos].Y,
&gru[gro_index].pro.v[vertexPos].Z);
vertexPos++;
}
else if (buffer[1] == 't')
{
fsetpos(f, &pos);
fscanf(f, "v %f %f ", &gru[gro_index].pro.vt[texturePos].TU,
&gru[gro_index].pro.vt[texturePos].TV);
texturePos++;
}
else if (buffer[1] == 'n')
{
fsetpos(f, &pos);
fscanf(f, "v %f %f %f", &gru[gro_index].pro.vn[normalsPos].X,
&gru[gro_index].pro.vn[normalsPos].Y,
&gru[gro_index].pro.vn[normalsPos].Z);
normalsPos++;
}
}
}
for(int i= 0; i<gro_index+1; i++)
{
printf("Group name %s: ", gru[i].names);
printf("nVertex %d Normals %d Texture Coordi %dn", gru[i].pro.vSize, gru[i].pro.vnSize, gru[i].pro.vtSize );
}
rewind(f);
temp_VertexSize =0;
temp_TextureCoords = 0;
temp_Normals = 0;
while (true)
{
if(feof(f)) break;
fgets(buffer, 20, f);
if(buffer[0] == 'g' && buffer[1] == ' ')
break;
if (buffer[0] == 'v' && buffer[1] == ' ')
temp_VertexSize++;
else if (buffer[0] == 'v' && buffer[1] == 'n')
temp_Normals++;
else if (buffer[0] == 'v' && buffer[1] == 't')
temp_TextureCoords++;
}
printf("%d n", temp_VertexSize);
rewind(f);
texturePos =0;
vertexPos=0;
normalsPos=0;
Vertex * vertex = new Vertex[temp_VertexSize];
TextureCoor * vt = new TextureCoor[temp_TextureCoords];
Normals * normals = new Normals[temp_Normals];
while (true)
{
fgetpos(f, &pos);
if(feof(f)) break;
fgets(buffer, 20, f);
if (buffer[0] == 'g' && buffer[1] == ' ')
break;
if (buffer[0] == 'v' && buffer[1] == ' ')
{
fsetpos(f, &pos);
fscanf(f, "v %f %f %f", &vertex[vertexPos].X,&vertex[vertexPos].Y,&vertex[vertexPos].Z );
vertexPos++;
}
else if (buffer[0] == 'v' && buffer[1] == 't')
{
fsetpos(f, &pos);
fscanf(f, "vt %f %f", &vt[texturePos].TU,&vt[texturePos].TV);
texturePos++;
}
else if (buffer[0] == 'v' && buffer[1] == 'n')
{
fsetpos(f, &pos);
fscanf(f, "vn %f %f %f",&normals[normalsPos].X,&normals[normalsPos].Y,&normals[normalsPos].Z );
normalsPos++;
}
}
printf("Vertex and others that not were in a groupn");
printf("V %d VN %d VT %dn", vertexPos, normalsPos, texturePos);
delete[] vertex;
delete[] normals;
delete[] vt;
fclose(f);
}*/
bool ObjLoad::Load(char* name)
{
if (!name && strlen(name) < 0) return false;
FILE *f = fopen(name, "r");
if (!f) return false;
int temp_VertexSize = 0;
int temp_Face = 0;
int temp_TextureCoords = 0;
int temp_Normals = 0;
char buffer[30];
while (true)
{
if(feof(f)) break;
fgets(buffer, 30, f);
if (buffer[0] == 'v' && buffer[1] == ' ')
temp_VertexSize++;
else if (buffer[0] == 'v' && buffer[1] == 'n')
temp_Normals++;
else if (buffer[0] == 'v' && buffer[1] == 't')
temp_TextureCoords++;
}
printf("%d n", temp_VertexSize);
rewind(f);
fpos_t pos;
int vertexPos = 0;
int texturePos = 0;
int normalsPos = 0;
vertex = new Vertex[temp_VertexSize];
vt = new TextureCoor[temp_TextureCoords];
normals = new Normals[temp_Normals];
std::vector<short> indices;
indices.data();
while (true)
{
fgetpos(f, &pos);
if (feof(f)) break;
fgets(buffer, 30, f);
if (buffer[0] == 'v')
{
if (buffer[1] == ' ')
{
fsetpos(f, &pos);
fscanf(f, "v %f %f %f", &vertex[vertexPos].X, &vertex[vertexPos].Y, &vertex[vertexPos].Z);
vertexPos++;
}
else if (buffer[1] == 't')
{
fsetpos(f, &pos);
fscanf(f, "vt %f %f", &vt[texturePos].TU, &vt[texturePos].TV);
texturePos++;
}
else if (buffer[1] == 'n')
{
fsetpos(f, &pos);
fscanf(f, "vn %f %f %f", &normals[normalsPos].X, &normals[normalsPos].Y, &normals[normalsPos].Z);
normalsPos++;
}
}
else if (buffer[0] == 'f' && buffer[1] == ' ')
{
fsetpos(f, &pos);
UINT32 a[8];;
fscanf(f, "f %f/%f/%f %f/%f/%f %f/%f/%f", &a[0],&a[1],&a[2] ,&a[3],&a[4],&a[5], &a[6], &a[7], &a[8]);
indices.push_back(a[0]);
indices.push_back(a[3]);
indices.push_back(a[6]);
}
}
vertex_size = temp_VertexSize;
indicesData = indices.data();
indices_size = indices.size();
fclose(f);
}
void ObjLoad::Clean()
{
if (vertex)
{
delete[] vertex;
vertex = 0;
}if (normals)
{
delete[] normals;
normals = 0;
}if (vt)
{
delete[] vt;
vt = 0;
}
}
Load Obj:
load.Load("Su-35_SuperFlanker/Su-35_SuperFlanker.obj");
Vertex * v= load.getVertex();
int size = load.getVertexSize();
// create a vertex buffer interface called v_buffer
d3ddev->CreateVertexBuffer(size*sizeof(Vertex),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
&v_buffer,
NULL);
VOID* pVoid; // a void pointer
// lock v_buffer and load the vertices into it
v_buffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, v, sizeof(Vertex) * size);
v_buffer->Unlock();
short* indices = load.getIndices();
int indicesSize = load.indicesSize();
// create an index buffer interface called i_buffer
d3ddev->CreateIndexBuffer(indicesSize*sizeof(short),
0,
D3DFMT_INDEX16,
D3DPOOL_MANAGED,
&i_buffer,
NULL);
// lock i_buffer and load the indices into it
i_buffer->Lock(0, 0, (void**)&pVoid, 0);
memcpy(pVoid, indices, sizeof(short)* indicesSize);
i_buffer->Unlock();
load.Clean();
Render:
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
d3ddev->BeginScene();
d3ddev->SetFVF(CUSTOMFVF);
D3DXMATRIX viewMatrix;
D3DXMatrixLookAtLH( &viewMatrix,
&D3DXVECTOR3(x,y,z ), //position
&D3DXVECTOR3(x,y,0), //Look at
&D3DXVECTOR3(0.0f, 1.0f, 0.0f));
d3ddev->SetTransform(D3DTS_VIEW, &(viewMatrix));
// set the projection transform
D3DXMATRIX matProjection; // the projection transform matrix
D3DXMatrixPerspectiveFovLH(&matProjection,
D3DX_PI / 4, // the horizontal field of view
(FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT, // aspect ratio
1.0f, // the near view-plane
300.0f); // the far view-plane
d3ddev->SetTransform(D3DTS_PROJECTION, &matProjection); // set the projection
D3DXMATRIX rot;
static float x = 0; x+= 0.01f;
D3DXMatrixRotationY(&rot, x);
d3ddev->SetTransform(D3DTS_VIEW, &(rot));
// select the vertex buffer to display
d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
d3ddev->SetIndices(i_buffer);
// draw the Hypercraft
d3ddev->DrawIndexedPrimitive(D3DPT_LINELIST, 0, 0, load.getVertexSize(), 0, load.indicesSize()/3);
DrawText(fpsB, 0, 30);
d3ddev->EndScene();
d3ddev->Present(NULL, NULL, NULL, NULL);
I do not What do I do wrong and, How to improve my code ?