219 lines
6.7 KiB
C
219 lines
6.7 KiB
C
#ifndef RES_MODEL_H_INCLUDED
|
|
#define RES_MODEL_H_INCLUDED
|
|
|
|
#include <BaseTypes.h>
|
|
|
|
enum
|
|
{
|
|
Vbo_Unload = 0,
|
|
Vbo_Loaded,
|
|
Vbo_BufGen,
|
|
Vbo_LoadFail,
|
|
};
|
|
|
|
#define VBO_HDR_NONE 0
|
|
#define VBO_HDR_NORML 1
|
|
#define VBO_HDR_TEXC 2
|
|
#define VBO_HDR_NOR_TXC (VBO_HDR_NORML|VBO_HDR_TEXC)
|
|
|
|
static const char *vboFilePath[] =
|
|
{
|
|
// "./Res/model3d/CarTestPrd.vbo",
|
|
// "./Res/model3d/CarTestPrd.vbo",
|
|
// "./Res/model3d/CarTestPrd.vbo",
|
|
// "./Res/model3d/CarLargePrd.vbo",
|
|
// "./Res/model3d/CarMediumPrd.vbo",
|
|
// "./Res/model3d/CarSmallPrd.vbo",
|
|
// "./Res/model3d/TexCarLarge_rd0.vbo",
|
|
// "./Res/model3d/TexCarMedium.vbo",
|
|
// "./Res/model3d/TexCarSmall.vbo",
|
|
"./Res/model3d/truck_1.vbo",
|
|
"./Res/model3d/car_1.vbo",//car_1
|
|
"./Res/model3d/bicycle_1.vbo",
|
|
};
|
|
|
|
enum
|
|
{
|
|
VBO_CarLarge = 0,
|
|
VBO_CarMedium,
|
|
VBO_CarSmall,
|
|
VBO_NUM,
|
|
};
|
|
|
|
static GLfloat vboMaterialGray[] =
|
|
{
|
|
0.3f, 0.3f, 0.3f, 1.0f,
|
|
0.3f, 0.3f, 0.3f, 1.0f,
|
|
0.3f, 0.3f, 0.3f, 1.0f,
|
|
0.0f, 5.0f, 40.0f, 1.0f,
|
|
};
|
|
|
|
static GLfloat vboMaterialRed[] =
|
|
{
|
|
0.5f, 0.25f, 0.25f, 1.0f,
|
|
0.4f, 0.3f, 0.3f, 1.0f,
|
|
0.35f, 0.3f, 0.3f, 1.0f,
|
|
0.0f, 5.0f, 40.0f, 1.0f,
|
|
};
|
|
|
|
static GLfloat vboMaterialBlue[] =
|
|
{
|
|
0.1f, 0.2f, 0.45f, 1.0f,
|
|
0.1f, 0.2f, 0.45f, 1.0f,
|
|
0.1f, 0.2f, 0.45f, 1.0f,
|
|
0.0f, 5.0f, 40.0f, 1.0f,
|
|
};
|
|
|
|
static UInt08 vboStatus[VBO_NUM];
|
|
static Model3DVbo vboModel[VBO_NUM];
|
|
static const GLenum vboIdxType[5] =
|
|
{
|
|
GL_UNSIGNED_BYTE, /*-0-*/
|
|
GL_UNSIGNED_BYTE, /* 1 */
|
|
GL_UNSIGNED_SHORT, /* 2 */
|
|
GL_UNSIGNED_SHORT, /*-3-*/
|
|
GL_UNSIGNED_INT, /* 4 */
|
|
};
|
|
|
|
static void Once_InitVboModelInfo()
|
|
{
|
|
static Bool flag = INS_FALSE;
|
|
if(flag == INS_TRUE)return;
|
|
flag = INS_TRUE;
|
|
|
|
Int32 i;
|
|
for(i = 0; i < VBO_NUM; i++)
|
|
{
|
|
vboModel[i].hdr = VBO_NOT_NOR_AND_TXC;
|
|
vboModel[i].idx_type = 1;
|
|
vboModel[i].idx_num = 0;
|
|
vboModel[i].face_num = 0;
|
|
vboModel[i].vtxs = NULL;
|
|
vboModel[i].txcs = NULL;
|
|
vboModel[i].nors = NULL;
|
|
vboModel[i].idx = NULL;
|
|
vboModel[i].buf[0] = INS_INVALID_RES_ID;
|
|
vboModel[i].buf[1] = INS_INVALID_RES_ID;
|
|
vboModel[i].buf[2] = INS_INVALID_RES_ID;
|
|
vboModel[i].buf[3] = INS_INVALID_RES_ID;
|
|
vboStatus[i] = Vbo_Unload;
|
|
}
|
|
}
|
|
|
|
static void Once_LoadVboModelData(Int32 id)
|
|
{
|
|
if(id < 0 || id >= VBO_NUM || vboStatus[id] != Vbo_Unload)return;
|
|
|
|
PrintCurrentTimeMs();
|
|
printf("loading vbo file[%s]\n", vboFilePath[id]);
|
|
if(LoadVbo(&vboModel[id], vboFilePath[id]) != INS_TRUE)
|
|
{
|
|
printf("load vbo file fail[%s]\n", vboFilePath[id]);
|
|
vboStatus[id] = Vbo_LoadFail;
|
|
return;
|
|
}
|
|
vboStatus[id] = Vbo_Loaded;
|
|
PrintCurrentTimeMs();
|
|
}
|
|
|
|
enum{VBO_BUF_VTX = 0, VBO_BUF_TXC, VBO_BUF_NOR, VBO_BUF_IDX};
|
|
|
|
static void Once_GenVboBuffer(Int32 id)
|
|
{
|
|
if(vboModel[id].vtxs == NULL || (vboModel[id].txcs == NULL && vboModel[id].nors == NULL))return;
|
|
vboStatus[id] = Vbo_BufGen;
|
|
|
|
PrintCurrentTimeMs();
|
|
// printf("generating vbo buffer[%s]\n", vboFilePath[id]);
|
|
// printf("Once_GenVboBuffer GL_ERR_CODE[0x%x]\n", glGetError());
|
|
glGenBuffers(4, vboModel[id].buf);
|
|
// printf("glGenBuffers GL_ERR_CODE[0x%x]\n", glGetError());
|
|
glBindBuffer(GL_ARRAY_BUFFER, vboModel[id].buf[VBO_BUF_VTX]);
|
|
// printf("glBindBuffer vtx GL_ERR_CODE[0x%x]\n", glGetError());
|
|
glBufferData(GL_ARRAY_BUFFER, vboModel[id].idx_num*3*sizeof(Flt32), vboModel[id].vtxs, GL_STATIC_DRAW);
|
|
// printf("glBufferData vtx GL_ERR_CODE[0x%x]\n", glGetError());
|
|
if((vboModel[id].hdr & VBO_HAVA_TEXTCOORDS) && vboModel[id].txcs != NULL)
|
|
{
|
|
glBindBuffer(GL_ARRAY_BUFFER, vboModel[id].buf[VBO_BUF_TXC]);
|
|
// printf("glBindBuffer txc GL_ERR_CODE[0x%x]\n", glGetError());
|
|
glBufferData(GL_ARRAY_BUFFER, vboModel[id].idx_num*2*sizeof(Flt32), vboModel[id].txcs, GL_STATIC_DRAW);
|
|
// printf("glBufferData txc GL_ERR_CODE[0x%x]\n", glGetError());
|
|
}
|
|
if((vboModel[id].hdr & VBO_HAVA_NORMALS) && vboModel[id].nors != NULL)
|
|
{
|
|
glBindBuffer(GL_ARRAY_BUFFER, vboModel[id].buf[VBO_BUF_NOR]);
|
|
// printf("glBindBuffer nor GL_ERR_CODE[0x%x]\n", glGetError());
|
|
glBufferData(GL_ARRAY_BUFFER, vboModel[id].idx_num*3*sizeof(Flt32), vboModel[id].nors, GL_STATIC_DRAW);
|
|
// printf("glBufferData nor GL_ERR_CODE[0x%x]\n", glGetError());
|
|
}
|
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboModel[id].buf[VBO_BUF_IDX]);
|
|
// printf("glBindBuffer idx GL_ERR_CODE[0x%x]\n", glGetError());
|
|
switch(vboModel[id].idx_type)
|
|
{
|
|
case 4:
|
|
// *idx_type = GL_UNSIGNED_INT;
|
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vboModel[id].face_num*3*sizeof(UInt32), vboModel[id].idx, GL_STATIC_DRAW);
|
|
// printf("glBufferData idx 4 GL_ERR_CODE[0x%x]\n", glGetError());
|
|
break;
|
|
case 2:
|
|
// *idx_type = GL_UNSIGNED_SHORT;
|
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vboModel[id].face_num*3*sizeof(UInt16), vboModel[id].idx, GL_STATIC_DRAW);
|
|
// printf("glBufferData idx 2 GL_ERR_CODE[0x%x]\n", glGetError());
|
|
break;
|
|
default:
|
|
// *idx_type = GL_UNSIGNED_BYTE;
|
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vboModel[id].face_num*3*sizeof(UInt08), vboModel[id].idx, GL_STATIC_DRAW);
|
|
// printf("glBufferData idx 1 GL_ERR_CODE[0x%x]\n", glGetError());
|
|
break;
|
|
}
|
|
PrintCurrentTimeMs();
|
|
}
|
|
|
|
static void DestroyVboResources()
|
|
{
|
|
Int32 i;
|
|
|
|
for(i = 0; i < VBO_NUM; i++)
|
|
{
|
|
if(vboModel[i].vtxs != NULL)
|
|
{
|
|
free(vboModel[i].vtxs);
|
|
}
|
|
if(vboModel[i].txcs != NULL)
|
|
{
|
|
free(vboModel[i].txcs);
|
|
}
|
|
if(vboModel[i].nors != NULL)
|
|
{
|
|
free(vboModel[i].nors);
|
|
}
|
|
if(vboModel[i].idx != NULL)
|
|
{
|
|
free(vboModel[i].idx);
|
|
}
|
|
if(vboModel[i].buf[VBO_BUF_VTX] != INS_INVALID_RES_ID)
|
|
{
|
|
glDeleteBuffers(1, &(vboModel[i].buf[VBO_BUF_VTX]));
|
|
vboModel[i].buf[VBO_BUF_VTX] = INS_INVALID_RES_ID;
|
|
}
|
|
if(vboModel[i].buf[VBO_BUF_TXC] != INS_INVALID_RES_ID)
|
|
{
|
|
glDeleteBuffers(1, &(vboModel[i].buf[VBO_BUF_TXC]));
|
|
vboModel[i].buf[VBO_BUF_TXC] = INS_INVALID_RES_ID;
|
|
}
|
|
if(vboModel[i].buf[VBO_BUF_NOR] != INS_INVALID_RES_ID)
|
|
{
|
|
glDeleteBuffers(1, &(vboModel[i].buf[VBO_BUF_NOR]));
|
|
vboModel[i].buf[VBO_BUF_NOR] = INS_INVALID_RES_ID;
|
|
}
|
|
if(vboModel[i].buf[VBO_BUF_IDX] != INS_INVALID_RES_ID)
|
|
{
|
|
glDeleteBuffers(1, &(vboModel[i].buf[VBO_BUF_IDX]));
|
|
vboModel[i].buf[VBO_BUF_IDX] = INS_INVALID_RES_ID;
|
|
}
|
|
vboStatus[i] = Vbo_Unload;
|
|
}
|
|
}
|
|
|
|
#endif // RES_MODEL_H_INCLUDED
|