Quantcast
Channel: Question and Answer » game-loop
Viewing all articles
Browse latest Browse all 30

Directx 9 Obj Model

$
0
0

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 ?


Viewing all articles
Browse latest Browse all 30

Trending Articles