Files
Client/Engine/Effect/EffMeshloader.cpp
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

1231 lines
37 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "EffMeshloader.h"
CEffectMesh::CEffectMesh() {
frame = 0.0f;
wadfile = NULL;
vert = NULL;
vert2 = NULL;
texture = NULL;
max_frame = -1.0f;
m_NullTexture = false;
SrcBlend = D3DBLEND_SRCALPHA;
DstBlend = D3DBLEND_INVSRCALPHA;
Color = 0xffffffff;
vot = VOT;
m_Loop = true;
m_Start = true;
m_texanistart = false;
pick_index = -1;
}
void CEffectMesh::SetAlpha(int al) {
Color = D3DCOLOR_ARGB(al,255,255,255);
}
CEffectMesh::~CEffectMesh() {
int i;
if(vert != NULL) {
delete[] vert;
vert = NULL;
}
if(vert2 != NULL) {
delete[] vert2;
vert2 = NULL;
}
if(texture_count >0)
delete[] texture;
for(i=0;i<Model.object_num;i++)
object[i]->Release();
for(i=0;i<Model.object_num;i++) {
object_sub[i].sub.clear();
}
delete[] object_sub;
object_sub = NULL;
for(i=0;i<Model.object_num;i++) {
if(Model.pobject[i].face) {
delete [] Model.pobject[i].face;
Model.pobject[i].face = NULL;
}
if(Model.pobject[i].texcoord) {
delete [] Model.pobject[i].texcoord;
Model.pobject[i].texcoord = NULL;
}
if(Model.pobject[i].vertex) {
delete [] Model.pobject[i].vertex;
Model.pobject[i].vertex = NULL;
}
Model.pobject[i].rot_key.clear();
Model.pobject[i].pos_key.clear();
if(Model.pobject[i].bRandTex || Model.pobject[i].bTexani)
delete[] Model.pobject[i].anitexture;
}
Model.pmaterial.clear();
Model.pobject.clear();
}
float CEffectMesh::UpdateMesh(){
int i;
//rand or tex ani update
for(i=0;i<Model.object_num;i++) {
if(Model.pobject[i].bRandTex) {
if((int)frame % (int)Model.pobject[i].texchange_frame == 0)
Model.pobject[i].current_tex = rand()%(Model.pobject[i].AniTexNum);
}
else if(Model.pobject[i].bTexani) {
if((int)frame % (int)Model.pobject[i].texchange_frame == 0) {
Model.pobject[i].current_tex++;
if(Model.pobject[i].current_tex >= Model.pobject[i].AniTexNum)
Model.pobject[i].current_tex = 0;
}
}
}
if(m_Start) {
frame+=vot;
}
if(frame >max_frame) {
if(m_Loop)
frame = 0;
else
frame = max_frame;
}
return frame;
}
void CEffectMesh::SetTexAniFrame(int object_index,float frame){
Model.pobject[object_index].texchange_frame = frame;
}
void CEffectMesh::SetStartTexAni(int object_index,float frame) {
Model.pobject[object_index].texstart_frame = frame;
}
bool CEffectMesh::LoadWadfile(char *filename,LPDIRECT3DDEVICE8 device) {
char buf[BUF_SIZE] = {0};
char *token;
char *tmp_ptr = NULL;
char texnum[2] = {0};
int object_num;
int material_num;
float max;
int i,j,k;
int vertex_num,texcoord_num;
int pos_num,rot_num,scale_num;
int morph_num,face_num;
int vert_num;
int length = 0;
AsePosKey tmp_pos;
AseRotKey tmp_rot;
AseScaleKey tmp_scale;
AseMorphObject tmp_morph;
AseMaterial tmp;
AseObject tmp_object;
wadfile = fopen(filename,"rb");
if(wadfile == NULL) {
MessageBox(NULL,"file not found","error",MB_OK);
PostQuitMessage(0);
return false;
}
fread((char *)buf,1,255,wadfile);
token = strtok(buf,"\n");
//wad file check..
if(strcmp(token,EFF_FILE)) {
sprintf(buf,"%s is not WAD(Wizardbug Ase Data) file.",filename);
MessageBox(NULL,buf,"error",MB_OK);
PostQuitMessage(0);
}
fread((char *)buf,1,255,wadfile);
token = strtok(buf,"\n ");
object_num = atoi(token);
token = strtok(NULL,"\n ");
material_num = atoi(token);
token = strtok(NULL,"\n ");
max = atoi(token);
// material num,object num, max face load
Model.material_num = material_num;
Model.object_num = object_num;
max_frame = max;
// material load.
for(i=0;i<material_num;i++) {
Model.pmaterial.push_back(tmp);
fread((AseMaterial *)&(Model.pmaterial[i]),1,sizeof(AseMaterial),wadfile);
/////////// bmp ->dds
tmp_ptr = strstr(Model.pmaterial[i].texture_name,"bmp");
if(tmp_ptr == NULL) {
tmp_ptr = strstr(Model.pmaterial[i].texture_name,"BMP");
}
if(tmp_ptr != NULL) {
*tmp_ptr = 'd';
tmp_ptr++;
*tmp_ptr = 'd';
tmp_ptr++;
*tmp_ptr = 's';
tmp_ptr = NULL;
}
/////////////////
Model.pmaterial[i].sub = new AseMaterial[Model.pmaterial[i].sub_num];
for(k=0;k<Model.pmaterial[i].sub_num;k++) {
fread((AseMaterial *)&(Model.pmaterial[i].sub[k]),1,sizeof(AseMaterial),wadfile);
tmp_ptr = strstr(Model.pmaterial[i].sub[k].texture_name,"bmp");
if(tmp_ptr == NULL) {
tmp_ptr = strstr(Model.pmaterial[i].sub[k].texture_name,"BMP");
}
if(tmp_ptr != NULL) {
*tmp_ptr = 'd';
tmp_ptr++;
*tmp_ptr = 'd';
tmp_ptr++;
*tmp_ptr = 's';
tmp_ptr = NULL;
}
}
}
object = new LPDIRECT3DVERTEXBUFFER8[object_num];
////// object sub face list create/////////////////////////////
object_sub = new WadFace[object_num];
// object load.
for(i=0;i<object_num;i++) {
Model.pobject.push_back(tmp_object);
fread((char *)buf,1,255,wadfile);
token = strtok(buf,"\n ");
Model.pobject[i].btexture = (bool)atoi(token);
token = strtok(NULL,"\n ");
face_num = Model.pobject[i].face_num = atoi(token);
token = strtok(NULL,"\n ");
vertex_num = Model.pobject[i].vertex_num = atoi(token);
token = strtok(NULL,"\n ");
texcoord_num = Model.pobject[i].texcoord_num = atoi(token);
token = strtok(NULL,"\n ");
Model.pobject[i].bparent = (bool)atoi(token);
token = strtok(NULL,"\n ");
Model.pobject[i].material_id = atoi(token);
token = strtok(NULL,"\n ");
Model.pobject[i].bmorph = (bool)atoi(token);
fread((char *)Model.pobject[i].object_name,1,255,wadfile);
length = strlen(Model.pobject[i].object_name);
// tex change ani get.
Model.pobject[i].bBil = false;
Model.pobject[i].bBil2 = false;
Model.pobject[i].bTexani = false;
Model.pobject[i].bRandTex = false;
Model.pobject[i].bMorphStart = false;
Model.pobject[i].bZ = false;
Model.pobject[i].bCull = false;
Model.pobject[i].current_tex = 0;
Model.pobject[i].AniTexNum = 0;
Model.pobject[i].texchange_frame = 1.0f;
Model.pobject[i].texstart_frame = 0.0f;
Model.pobject[i].ObjectColor = D3DCOLOR_ARGB(255,255,255,255);
Model.pobject[i].ObjectPickColor = D3DCOLOR_ARGB(255,255,255,0);
if(strchr(Model.pobject[i].object_name,'T') != NULL) {
Model.pobject[i].bTexani = true;
Model.pobject[i].bRandTex = false;
Model.pobject[i].AniTexNum = atoi(strchr(Model.pobject[i].object_name,'0'));
CreateAniTexture(device,i);
// <20><><EFBFBD><EFBFBD> <20>ҷ<EFBFBD><D2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> tex index
Model.pobject[i].current_tex = 0;
}
else if(strchr(Model.pobject[i].object_name,'R') != NULL) {
Model.pobject[i].bTexani = true;
Model.pobject[i].bRandTex = true;
Model.pobject[i].AniTexNum = atoi(strchr(Model.pobject[i].object_name,'0'));
CreateAniTexture(device,i);
}
//bilboard
if(strchr(Model.pobject[i].object_name,'B') != NULL) { // bilboard
// <20><>ǥ<EFBFBD><C7A5> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Model.pobject[i].bBil = true;
}
if(strchr(Model.pobject[i].object_name,'C') != NULL) { // bilboard2
//<2F><>ǥ<EFBFBD><C7A5><EFBFBD><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> .
Model.pobject[i].bBil2 = true;
}
if(strchr(Model.pobject[i].object_name,'W') != NULL) { //cullnone
//<2F><>ǥ<EFBFBD><C7A5><EFBFBD><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> .
Model.pobject[i].bCull = true;
}
if(strchr(Model.pobject[i].object_name,'Z') != NULL) { //cullnone
//<2F><>ǥ<EFBFBD><C7A5><EFBFBD><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> .
Model.pobject[i].bZ = true;
}
char *tmp_MorphStart = NULL;
float tmp_MorphFrame = 0;
if((tmp_MorphStart = strchr(Model.pobject[i].object_name,'F')) != NULL) {
Model.pobject[i].bMorphStart = true;
tmp_MorphStart++;
tmp_MorphFrame = atoi(tmp_MorphStart);
}
if(Model.pobject[i].bparent) {
fread((char *)Model.pobject[i].parent_name,1,255,wadfile);
}
//matrix load
fread((D3DXMATRIX *)&(Model.pobject[i].matrix),1,sizeof(D3DXMATRIX),wadfile);
// vertex num load
fread((char *)buf,1,255,wadfile);
token = strtok(buf,"\n ");
vert_num = atoi(token);
// vertex load
if(Model.pobject[i].btexture) {
vert = new custom_vertex[vert_num];
fread((custom_vertex *)vert,sizeof(custom_vertex),vert_num,wadfile);
}
else {
vert2 = new D3DXVECTOR3[vert_num];
fread((D3DXVECTOR3 *)vert2,sizeof(D3DXVECTOR3),vert_num,wadfile);
}
Model.pobject[i].face = new AseFace[face_num];
fread((AseFace *)(Model.pobject[i].face),sizeof(AseFace),face_num,wadfile);
////////////////////////////////////// sub face load///////////////////////////////
if(Model.material_num >0) {
if(Model.pmaterial[Model.pobject[i].material_id].sub_num >0)
LoadSubface(i);
}
Model.pobject[i].vertex = new D3DXVECTOR3[vertex_num];
fread((D3DXVECTOR3 *)(Model.pobject[i].vertex),sizeof(D3DXVECTOR3),vertex_num,wadfile);
if(Model.pobject[i].btexture) {
Model.pobject[i].normal = new D3DXVECTOR3[vertex_num];
fread((D3DXVECTOR3 *)(Model.pobject[i].normal),sizeof(D3DXVECTOR3),vertex_num,wadfile);
Model.pobject[i].texcoord = new D3DXVECTOR2[texcoord_num];
fread((D3DXVECTOR2 *)(Model.pobject[i].texcoord),sizeof(D3DXVECTOR2),texcoord_num,wadfile);
}
//pos key,rot key morph key num load
fread((char *)buf,1,255,wadfile);
token = strtok(buf,"\n ");
pos_num = atoi(token);
token = strtok(NULL,"\n ");
rot_num = atoi(token);
token = strtok(NULL,"\n ");
scale_num = atoi(token);
token = strtok(NULL,"\n ");
morph_num = atoi(token);
Model.pobject[i].pos_keyNum = pos_num;
Model.pobject[i].rot_keyNum = rot_num;
Model.pobject[i].scale_KeyNum = scale_num;
Model.pobject[i].morph_num = morph_num;
// default object color
Model.pobject[i].ObjectColor = D3DCOLOR_ARGB(255,255,255,255);
//pos key load
for(j=0;j<pos_num;j++) {
fread((AsePosKey *)&tmp_pos,sizeof(AsePosKey),1,wadfile);
Model.pobject[i].pos_key.push_back(tmp_pos);
}
//rot key load
for(j=0;j<rot_num;j++) {
fread((AseRotKey *)&tmp_rot,sizeof(AseRotKey),1,wadfile);
Model.pobject[i].rot_key.push_back(tmp_rot);
}
if(rot_num != 0) {
//quaternion
Model.pobject[i].rot_quatkey = new D3DXQUATERNION[Model.pobject[i].rot_keyNum];
fread((D3DXQUATERNION *)Model.pobject[i].rot_quatkey,sizeof(D3DXQUATERNION),Model.pobject[i].rot_keyNum,wadfile);
}
for(j=0;j<scale_num;j++) {
fread((AseScaleKey *)&tmp_scale,sizeof(AseScaleKey),1,wadfile);
Model.pobject[i].scale_key.push_back(tmp_scale);
}
//morph key load
if(Model.pobject[i].bmorph) {
for(j=0;j<morph_num;j++) {
Model.pobject[i].morph.push_back(tmp_morph);
Model.pobject[i].morph[j].vertex = new D3DXVECTOR3[vertex_num];
Model.pobject[i].morph[j].texcoord = new D3DXVECTOR2[texcoord_num];
Model.pobject[i].morph[j].normal = new D3DXVECTOR3[vertex_num];
fread((char *)buf,1,255,wadfile);
token = strtok(buf,"\n ");
Model.pobject[i].morph[j].keynum = atoi(token);
//morph ani start <20><><EFBFBD><EFBFBD> SET
fread((D3DXVECTOR3 *)(Model.pobject[i].morph[j].vertex),sizeof(D3DXVECTOR3),vertex_num,wadfile);
fread((D3DXVECTOR2 *)(Model.pobject[i].morph[j].texcoord),sizeof(D3DXVECTOR2),texcoord_num,wadfile);
fread((D3DXVECTOR3 *)(Model.pobject[i].morph[j].normal),sizeof(D3DXVECTOR3),vertex_num,wadfile);
}
/////////////
if(Model.pobject[i].bMorphStart) {
Model.pobject[i].morph[0].keynum+=tmp_MorphFrame;
}
}
Model.pobject[i].vertex = new D3DXVECTOR3[vertex_num];
Create_Vertex(i,device);
}
CreateTexture(device);
fclose(wadfile);
return true;
}
float CEffectMesh::Render(LPDIRECT3DDEVICE8 device,D3DXVECTOR3 vecCenter) {
int i,j;
int tex_id;
int tex_i;
int tex_j;
int kt = 0;
int vcount = 0;
bool loop = true;
D3DXMATRIX world;
D3DXMATRIX back;
device->GetTransform(D3DTS_WORLD,&back);
//alphatest set
device->SetRenderState(D3DRS_ALPHATESTENABLE,TRUE);
device->SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_GREATER);
for(i=0;i<Model.object_num;i++) {
if(!Model.pobject[i].bZ)
device->SetRenderState(D3DRS_ZWRITEENABLE,FALSE);
vcount = 0;
D3DXMatrixIdentity(&world);
//rot
//D3DXMatrixRotationY(&world,rot);
//rot+=0.0001f;
//D3DXMatrixRotationX(&world,90.0f);
device->SetTransform(D3DTS_WORLD,&world);
if(Model.pobject[i].bBil2) {
D3DXMATRIX view;
D3DXMATRIX invers_view;
device->GetTransform(D3DTS_VIEW,&view);
view._41 = view._42 = view._43 =0.0;
D3DXMatrixInverse(&invers_view,NULL,&view);
D3DXMatrixMultiply(&world,&world,&invers_view);
device->SetTransform(D3DTS_WORLD,&world);
}
//////////////////////////////////////////////////////////////////////////////////////////////
// ani
/////////////////////////////////////////////////////////////////////////////////////////////
//global matrix get. (rot ,pos Ű<><C5B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> Ű<><C5B0> <20><><EFBFBD>ҽ<EFBFBD> <20><><EFBFBD>ٷ<EFBFBD> global <20><>ǥ<EFBFBD><C7A5> <20>ٲ<EFBFBD><D9B2><EFBFBD>
//<2F><> <20>۾<EFBFBD><DBBE><EFBFBD> <20>ʿ<EFBFBD> <20><><EFBFBD><EFBFBD>.
if(!Model.pobject[i].bmorph) {
if(Model.pobject[i].pos_keyNum<=0 && Model.pobject[i].rot_keyNum<=0 && Model.pobject[i].scale_KeyNum<=0) {
D3DXMatrixMultiply(&world,&(Model.pobject[i].matrix),&world);
device->SetTransform(D3DTS_WORLD,&world);
kt = 1;
}
if(!kt) {
if(Model.pobject[i].pos_keyNum <= 0) {
AsePosKey tmp;
Model.pobject[i].pos_key.push_back(tmp);
Model.pobject[i].pos_key[0].x = Model.pobject[i].matrix._41;
Model.pobject[i].pos_key[0].y = Model.pobject[i].matrix._42;
Model.pobject[i].pos_key[0].z = Model.pobject[i].matrix._43;
Model.pobject[i].pos_key[0].frame_num = 0.0f;
}
if(Model.pobject[i].rot_keyNum <=0) {
D3DXMATRIX tm = Model.pobject[i].matrix;
tm._41 = tm._42 = tm._43 = 0.0f;
D3DXMatrixMultiply(&world,&(tm),&world);
device->SetTransform(D3DTS_WORLD,&world);
}
if(Model.pobject[i].scale_KeyNum <=0) {
D3DXMATRIX tm = Model.pobject[i].matrix;
D3DXMATRIX tm2;
D3DXMatrixIdentity(&tm2);
tm2._11 = tm._11;
tm2._22 = tm._22;
tm2._33 = tm._33;
tm2._44 = tm._44;
D3DXMatrixMultiply(&world,&(tm2),&world);
device->SetTransform(D3DTS_WORLD,&world);
}
kt = 0;
}
D3DXMATRIX inverse;
D3DXMatrixInverse(&inverse,NULL,&(Model.pobject[i].matrix));
// local matrix get.
D3DXMatrixMultiply(&world,&inverse,&world);
device->SetTransform(D3DTS_WORLD,&world);
if(Model.pobject[i].pos_keyNum>0 || Model.pobject[i].rot_keyNum>0 || Model.pobject[i].scale_KeyNum>0) {
world = ScaleObject(device,i,frame,&world);
world = RotateObject(device,i,frame,&world);
world = TranslateObject(device,i,frame,&world);
device->SetTransform(D3DTS_WORLD,&world);
}
// wordl matrix get.
// <20>θ<EFBFBD><CEB8><EFBFBD> matrix<69><78> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ѵ<EFBFBD>.
int kt = i;
if(Model.pobject[kt].bparent) {
loop=true;
while(loop) {
for(j=0;j<Model.object_num;j++) {
if(!strcmp(Model.pobject[kt].parent_name,Model.pobject[j].object_name)) {
//parent ani func process
world = ScaleObject(device,i,frame,&world);
world = RotateObject(device,j,frame,&world);
world = TranslateObject(device,j,frame,&world);
device->SetTransform(D3DTS_WORLD,&world);
kt = j;
break;
}
}
if(j == Model.object_num)
loop = false;
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
else{
vertex_interpolation(i,frame);
Change_Vertexbuffer(i);
}
//bilboard
if(Model.pobject[i].bBil) {
D3DXMATRIX view;
D3DXMATRIX invers_view;
device->GetTransform(D3DTS_VIEW,&view);
view._41 = view._42 = view._43 =0.0;
D3DXMatrixInverse(&invers_view,NULL,&view);
D3DXMatrixMultiply(&world,&world,&invers_view);
device->SetTransform(D3DTS_WORLD,&world);
}
if(Model.pobject[i].bCull)
device->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
world._41 += vecCenter.x;
world._42 += vecCenter.y;
world._43 += vecCenter.z;
device->SetTransform(D3DTS_WORLD,&world);
//SetColor(D3DCOLOR_ARGB(255,255,255,255));
// alpha set
device->SetRenderState(D3DRS_SRCBLEND,SrcBlend);
device->SetRenderState(D3DRS_DESTBLEND,DstBlend);
device->SetRenderState(D3DRS_ALPHATESTENABLE,TRUE);
device->SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_GREATER);
device->SetRenderState(D3DRS_TEXTUREFACTOR,Model.pobject[i].ObjectColor);
// alpha value<75><65> 0 <20≯<EFBFBD> render skip
// if(!m_NullTexture) {
// if(Model.pobject[i].ObjectColor | 0x00ffffff == 0x00ffffff)
// continue;
// }
if(Model.pobject[i].btexture == true) {
if(Model.pmaterial[Model.pobject[i].material_id].sub_num > 0) { // sub texture ó<><C3B3>
device->BeginScene(); // tex ani<6E><69> sub texture <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
for(int k=0;k<object_sub[i].sub_num;k++) {
tex_id = Model.pobject[i].face[vcount].vertex_index[3];
//<2F>߸<EFBFBD><DFB8><EFBFBD> <20><><EFBFBD>͸<EFBFBD><CDB8><EFBFBD> <20><>ȣ <20><><EFBFBD><EFBFBD>
if(tex_id >= Model.pmaterial[Model.pobject[i].material_id].sub_num)
tex_j = 0;
else
tex_j = Model.pmaterial[Model.pobject[i].material_id].sub[tex_id].tex_id;
tex_i = Model.pmaterial[Model.pobject[i].material_id].tex_id;
device->SetTexture(0,NULL);
if(!m_NullTexture) {
HRESULT hr = device->SetTexture(0,texture[tex_j].GetTexture());
}
else{
if(i == pick_index)
device->SetRenderState(D3DRS_TEXTUREFACTOR,Model.pobject[i].ObjectPickColor);
else
device->SetRenderState(D3DRS_TEXTUREFACTOR,Model.pobject[i].ObjectColor);
}
device->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TFACTOR);
device->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_TEXTURE);
device->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
device->SetTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
device->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TFACTOR);
device->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_TEXTURE);
device->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);
device->SetTextureStageState(1,D3DTSS_COLOROP,D3DTOP_DISABLE);
device->SetStreamSource(0,object[i],sizeof(custom_vertex));
device->SetVertexShader(D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1);
//d_device->SetIndices(object_index[i],0);
//d_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,loader.Model.pobject[i].vertex_num,0,loader.Model.pobject[i].face_num);
device->DrawPrimitive(D3DPT_TRIANGLELIST,vcount*3,object_sub[i].sub[k]);
vcount +=object_sub[i].sub[k];
}
device->EndScene();
}
else {
device->SetTexture(0,NULL);
if(!m_NullTexture) {
if((Model.pobject[i].bRandTex) || (Model.pobject[i].bTexani)) {
device->SetTexture(0,Model.pobject[i].anitexture[(Model.pobject[i].current_tex)].GetTexture());
}
else
device->SetTexture(0,texture[Model.pmaterial[Model.pobject[i].material_id].tex_id].GetTexture());
}
else {
if(i == pick_index)
device->SetRenderState(D3DRS_TEXTUREFACTOR,Model.pobject[i].ObjectPickColor);
else
device->SetRenderState(D3DRS_TEXTUREFACTOR,Model.pobject[i].ObjectColor);
//device->SetRenderState(D3DRS_TEXTUREFACTOR,Model.pobject[i].ObjectPickColor);
}
//device->SetTexture(0,texture[Model.pmaterial[Model.pobject[i].material_id].tex_id]);
device->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TFACTOR);
device->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_TEXTURE);
device->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
device->SetTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
device->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TFACTOR);
device->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_TEXTURE);
device->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);
device->SetTextureStageState(1,D3DTSS_COLOROP,D3DTOP_DISABLE);
device->BeginScene();
device->SetStreamSource(0,object[i],sizeof(custom_vertex));
device->SetVertexShader(D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1);
//d_device->SetIndices(object_index[i],0);
//d_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,loader.Model.pobject[i].vertex_num,0,loader.Model.pobject[i].face_num);
int nFace=Model.pobject[i].face_num;
device->DrawPrimitive(D3DPT_TRIANGLELIST,0,nFace);
device->EndScene();
}
}
else { // not texture
device->BeginScene();
device->SetStreamSource(0,object[i],sizeof(D3DXVECTOR3));
device->SetVertexShader(D3DFVF_XYZ);
//d_device->SetIndices(object_index[i],0);
//d_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,loader.Model.pobject[i].vertex_num,0,loader.Model.pobject[i].face_num);
int nFace=Model.pobject[i].face_num;
device->DrawPrimitive(D3DPT_TRIANGLELIST,0,nFace);
device->EndScene();
} //texture not exist.
if(Model.pobject[i].bCull)
device->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);
if(!Model.pobject[i].bZ)
device->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);
//world = push;
//d_device->SetTransform(D3DTS_WORLD,&world);
//Model.pobject[i].ObjectPickColor = Model.pobject[i].ObjectColor;
}
device->SetRenderState(D3DRS_ALPHATESTENABLE,FALSE);
device->SetTransform(D3DTS_WORLD,&back);
return frame;
}
D3DXMATRIX CEffectMesh ::RotateObject(LPDIRECT3DDEVICE8 d_device,int object_index,float frame,D3DXMATRIX *w) {
D3DXMATRIX trans;
D3DXMATRIX tk;
static D3DXQUATERNION global;
D3DXQUATERNION local;
double interpol = 0.0;
int k=0;
if(Model.pobject[object_index].rot_keyNum) {
for(k=0;k<Model.pobject[object_index].rot_keyNum;k++) {
if((float)Model.pobject[object_index].rot_key[k].frame_num >=frame)
break;
}
if(k !=0) {
interpol = (double)(frame - Model.pobject[object_index].rot_key[k-1].frame_num)/(double)(Model.pobject[object_index].rot_key[k].frame_num - Model.pobject[object_index].rot_key[k-1].frame_num);
if(k == Model.pobject[object_index].rot_keyNum) {
k-=1;
interpol = 1.0;
}
if(interpol >1.0)
interpol = 1.0;
else if(interpol <0.0)
interpol = 0.0;
// y<><79><EFBFBD><EFBFBD> <20>ݴ<EFBFBD><DDB4><EFBFBD> <20>ǹǷ<C7B9> <20><>ȯ
Model.pobject[object_index].rot_quatkey[k-1].y = - Model.pobject[object_index].rot_quatkey[k-1].y;
Model.pobject[object_index].rot_quatkey[k].y = - Model.pobject[object_index].rot_quatkey[k].y;
D3DXQuaternionSlerp(&global,&(Model.pobject[object_index].rot_quatkey[k-1]),&(Model.pobject[object_index].rot_quatkey[k]),interpol);
// <20><><EFBFBD><EFBFBD>
Model.pobject[object_index].rot_quatkey[k-1].y = - Model.pobject[object_index].rot_quatkey[k-1].y;
Model.pobject[object_index].rot_quatkey[k].y = - Model.pobject[object_index].rot_quatkey[k].y;
}
else
D3DXQuaternionSlerp(&global,&(Model.pobject[object_index].rot_quatkey[k]),&(Model.pobject[object_index].rot_quatkey[k]),0);
D3DXMatrixRotationQuaternion(&trans,&global);
D3DXMatrixMultiply(w,w,&trans);
// d_device->SetTransform(D3DTS_WORLD,w);
return *w;
}
else {
return *w;
}
}
D3DXMATRIX CEffectMesh::ScaleObject(LPDIRECT3DDEVICE8 d_device,int object_index,float frame,D3DXMATRIX *w) {
int k=0;
double interpol = 0.0;
D3DXVECTOR3 tmp_scale;
D3DXVECTOR3 model_scale;
D3DXMATRIX sm;
D3DXMATRIX ta = *w;
if(Model.pobject[object_index].scale_KeyNum) {
for(k = 0;k<Model.pobject[object_index].scale_KeyNum;k++) {
if(Model.pobject[object_index].scale_key[k].frame_num >=frame)
break;
}
if(k != 0) {
interpol = (double)(frame - Model.pobject[object_index].scale_key[k-1].frame_num)/(double)(Model.pobject[object_index].scale_key[k].frame_num - Model.pobject[object_index].scale_key[k-1].frame_num);
if(k >= Model.pobject[object_index].scale_KeyNum) {
k-=1;
interpol = 1.0;
}
if(interpol >1.0)
interpol = 1.0;
else if(interpol <0.0)
interpol = 0.0;
tmp_scale.x = Model.pobject[object_index].scale_key[k].x - Model.pobject[object_index].scale_key[k-1].x;
tmp_scale.y = Model.pobject[object_index].scale_key[k].y - Model.pobject[object_index].scale_key[k-1].y;
tmp_scale.z = Model.pobject[object_index].scale_key[k].z - Model.pobject[object_index].scale_key[k-1].z;
model_scale.x = Model.pobject[object_index].scale_key[k-1].x + tmp_scale.x * interpol;
model_scale.y = Model.pobject[object_index].scale_key[k-1].y + tmp_scale.y * interpol;
model_scale.z = Model.pobject[object_index].scale_key[k-1].z + tmp_scale.z * interpol;
}
else { //k == 0
model_scale.x = Model.pobject[object_index].scale_key[0].x;
model_scale.y = Model.pobject[object_index].scale_key[0].y;
model_scale.z = Model.pobject[object_index].scale_key[0].z;
}
} // scale key <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else {
return ta;
}
D3DXMatrixIdentity(&sm);
sm._11 = model_scale.x;
sm._22 = model_scale.y;
sm._33 = model_scale.z;
D3DXMatrixMultiply(&ta,&ta,&sm);
return ta;
}
D3DXMATRIX CEffectMesh::TranslateObject(LPDIRECT3DDEVICE8 d_device,int object_index,float frame,D3DXMATRIX *w) {
int k = 0;
double interpol = 0.0;
D3DXVECTOR3 tmp_pos;
D3DXVECTOR3 model_pos;
D3DXMATRIX tm;
D3DXMATRIX tk;
D3DXMATRIX ta = *w;
if(Model.pobject[object_index].pos_keyNum) {
for(k=0;k<Model.pobject[object_index].pos_keyNum;k++) {
if(Model.pobject[object_index].pos_key[k].frame_num >=frame)
break;
}
if(k != 0) {
interpol = (double)(frame - Model.pobject[object_index].pos_key[k-1].frame_num)/(double)(Model.pobject[object_index].pos_key[k].frame_num - Model.pobject[object_index].pos_key[k-1].frame_num);
if(k >= Model.pobject[object_index].pos_keyNum) {
k-=1;
interpol = 1.0;
}
if(interpol >1.0)
interpol = 1.0;
else if(interpol <0.0)
interpol = 0.0;
tmp_pos.x = Model.pobject[object_index].pos_key[k].x - Model.pobject[object_index].pos_key[k-1].x;
tmp_pos.y = Model.pobject[object_index].pos_key[k].y - Model.pobject[object_index].pos_key[k-1].y;
tmp_pos.z = Model.pobject[object_index].pos_key[k].z - Model.pobject[object_index].pos_key[k-1].z;
model_pos.x = Model.pobject[object_index].pos_key[k-1].x + tmp_pos.x*interpol;
model_pos.y = Model.pobject[object_index].pos_key[k-1].y + tmp_pos.y*interpol;
model_pos.z = Model.pobject[object_index].pos_key[k-1].z + tmp_pos.z*interpol;
}
else {
tmp_pos.x =tmp_pos.y = tmp_pos.z = 0.0f;
model_pos.x = Model.pobject[object_index].pos_key[k].x + tmp_pos.x*interpol;
model_pos.y = Model.pobject[object_index].pos_key[k].y + tmp_pos.y*interpol;
model_pos.z = Model.pobject[object_index].pos_key[k].z + tmp_pos.z*interpol;
}
D3DXMatrixTranslation(&tm,model_pos.x,model_pos.y,model_pos.z);
ta._41 += tm._41;
ta._42 += tm._42;
ta._43 += tm._43;
//d_device->SetTransform(D3DTS_WORLD,&ta);
return ta;
}
//pos key not exist
else { //TM * parent matrix
tmp_pos.x =tmp_pos.y = tmp_pos.z = 0.0f;
model_pos.x = Model.pobject[object_index].pos_key[k].x + tmp_pos.x*interpol;
model_pos.y = Model.pobject[object_index].pos_key[k].y + tmp_pos.y*interpol;
model_pos.z = Model.pobject[object_index].pos_key[k].z + tmp_pos.z*interpol;
D3DXMatrixIdentity(&tm);
D3DXMatrixTranslation(&tm,model_pos.x,model_pos.y,model_pos.z);
ta._41 += tm._41;
ta._42 += tm._42;
ta._43 += tm._43;
//d_device->SetTransform(D3DTS_WORLD,&ta);
return ta;
}
}
void CEffectMesh::Create_Vertex(int i,LPDIRECT3DDEVICE8 device) {
int index_num = Model.pobject[i].face_num;
if(Model.pobject[i].btexture) {
device->CreateVertexBuffer( index_num*sizeof(custom_vertex) * 3,0,
D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1,D3DPOOL_MANAGED,&(object[i]));
VOID *tmp;
object[i]->Lock(0,index_num *sizeof(custom_vertex) * 3,
(BYTE **)&tmp,0);
memcpy(tmp,vert,index_num *sizeof(custom_vertex) * 3);
object[i]->Unlock();
delete[] vert;
vert = NULL;
}
else {
device->CreateVertexBuffer(index_num*3*sizeof(D3DXVECTOR3),0,
D3DFVF_XYZ,D3DPOOL_MANAGED,&(object[i]));
VOID *tmp;
object[i]->Lock(0,index_num*3*sizeof(D3DXVECTOR3),
(BYTE **)&tmp,0);
memcpy(tmp,vert2,index_num*3*sizeof(D3DXVECTOR3));
object[i]->Unlock();
delete[] vert2;
vert2 = NULL;
}
}
void CEffectMesh::SetFrame(float f) {
int i;
frame = f;
//rand or tex ani update
if(m_texanistart) {
for(i=0;i<Model.object_num;i++) {
if(frame >=Model.pobject[i].texstart_frame) {
if(Model.pobject[i].bRandTex) {
if((int)(frame - Model.pobject[i].texstart_frame) % (int)Model.pobject[i].texchange_frame == 0)
Model.pobject[i].current_tex = rand()%(Model.pobject[i].AniTexNum);
if(frame == 0)
Model.pobject[i].current_tex = 0;
}
else if(Model.pobject[i].bTexani) {
if((int)(frame - Model.pobject[i].texstart_frame) % (int)Model.pobject[i].texchange_frame == 0) {
Model.pobject[i].current_tex++;
if(Model.pobject[i].current_tex >= Model.pobject[i].AniTexNum)
Model.pobject[i].current_tex = 0;
if(frame == 0)
Model.pobject[i].current_tex = 0;
}
}
}
}
}
else {
for(i=0;i<Model.object_num;i++) {
if(Model.pobject[i].bRandTex || Model.pobject[i].bTexani)
Model.pobject[i].current_tex = 0;
}
}
}
void CEffectMesh::Change_Vertexbuffer(int object_index){
/////////////// face <20><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD>ؽ<EFBFBD> <20><><EFBFBD>ۿ<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD>
int index_num = 0;
int vertex_num = 0;
int j;
int k=0;
int tmp_index[4] = {0,0,0,0};
int tmp_coord[3] = {0,0};
vertex_num = Model.pobject[object_index].vertex_num;
index_num = Model.pobject[object_index].face_num;
if(!Model.pobject[object_index].btexture) {
vert2 = new D3DXVECTOR3[index_num*3];
for(j=0;j<index_num;j++) {
memcpy(tmp_index,&(Model.pobject[object_index].face[j].vertex_index),sizeof(int)*4);
vert2[k++] = Model.pobject[object_index].vertex[tmp_index[0]];
vert2[k++] = Model.pobject[object_index].vertex[tmp_index[1]];
vert2[k++] = Model.pobject[object_index].vertex[tmp_index[2]];
}
}
else if(Model.pobject[object_index].btexture) {
vert = new custom_vertex[index_num*3];
for(j=0;j<index_num;j++) {
memcpy(tmp_index,&(Model.pobject[object_index].face[j].vertex_index),sizeof(int)*4);
memcpy(tmp_coord,&(Model.pobject[object_index].face[j].coord_index),sizeof(int)*3);
vert[k].x = Model.pobject[object_index].vertex[tmp_index[0]].x;
vert[k].y = Model.pobject[object_index].vertex[tmp_index[0]].y;
vert[k].z = Model.pobject[object_index].vertex[tmp_index[0]].z;
vert[k].nx = Model.pobject[object_index].normal[tmp_index[0]].x;
vert[k].ny = Model.pobject[object_index].normal[tmp_index[0]].y;
vert[k].nz = Model.pobject[object_index].normal[tmp_index[0]].z;
vert[k].s = Model.pobject[object_index].texcoord[tmp_coord[0]].x;
vert[k++].t = Model.pobject[object_index].texcoord[tmp_coord[0]].y;
vert[k].x = Model.pobject[object_index].vertex[tmp_index[1]].x;
vert[k].y = Model.pobject[object_index].vertex[tmp_index[1]].y;
vert[k].z = Model.pobject[object_index].vertex[tmp_index[1]].z;
vert[k].nx = Model.pobject[object_index].normal[tmp_index[1]].x;
vert[k].ny = Model.pobject[object_index].normal[tmp_index[1]].y;
vert[k].nz = Model.pobject[object_index].normal[tmp_index[1]].z;
vert[k].s = Model.pobject[object_index].texcoord[tmp_coord[1]].x;
vert[k++].t = Model.pobject[object_index].texcoord[tmp_coord[1]].y;
vert[k].x = Model.pobject[object_index].vertex[tmp_index[2]].x;
vert[k].y = Model.pobject[object_index].vertex[tmp_index[2]].y;
vert[k].z = Model.pobject[object_index].vertex[tmp_index[2]].z;
vert[k].nx = Model.pobject[object_index].normal[tmp_index[2]].x;
vert[k].ny = Model.pobject[object_index].normal[tmp_index[2]].y;
vert[k].nz = Model.pobject[object_index].normal[tmp_index[2]].z;
vert[k].s = Model.pobject[object_index].texcoord[tmp_coord[2]].x;
vert[k++].t = Model.pobject[object_index].texcoord[tmp_coord[2]].y;
}
}
/////////////////////////////////
// vertex buffer create
////////////////////////////////
if(Model.pobject[object_index].btexture) {
VOID *tmp;
object[object_index]->Lock(0,index_num *sizeof(custom_vertex) * 3,
(BYTE **)&tmp,0);
memcpy(tmp,vert,index_num *sizeof(custom_vertex) * 3);
object[object_index]->Unlock();
delete[] vert;
vert = NULL;
}
else {
VOID *tmp;
object[object_index]->Lock(0,index_num*3*sizeof(D3DXVECTOR3),
(BYTE **)&tmp,0);
memcpy(tmp,vert2,index_num*3*sizeof(D3DXVECTOR3));
object[object_index]->Unlock();
delete[] vert2;
vert2 = NULL;
}
k=0;
}
int CEffectMesh::vertex_interpolation(int object_index,float now_frame) {
D3DXVECTOR3 tmp;
D3DXVECTOR3 move_vector;
D3DXVECTOR3 next_f;
D3DXVECTOR3 before_f;
D3DXVECTOR2 next_ft;
D3DXVECTOR2 before_ft;
D3DXVECTOR2 tmp_t;
D3DXVECTOR3 next_n;
D3DXVECTOR3 before_n;
D3DXVECTOR3 tmp_n;
float next_frame;
float before_frame;
double interpol = 0.0;
for(int i=0;i<Model.pobject[object_index].morph_num;i++) {
if(Model.pobject[object_index].morph[i].keynum > now_frame) {
next_frame = (float)i;
before_frame = (float)i-1.0f;
break;
}
}
if(i != Model.pobject[object_index].morph_num && i !=0) {
interpol = (double)(now_frame - Model.pobject[object_index].morph[before_frame].keynum) / (double)(Model.pobject[object_index].morph[next_frame].keynum - Model.pobject[object_index].morph[before_frame].keynum);
if(interpol <0.0f)
interpol = 0.0f;
else if(interpol >1.0f)
interpol = 1.0f;
for(int j=0;j<Model.pobject[object_index].vertex_num;j++) {
memcpy(&next_f,&(Model.pobject[object_index].morph[next_frame].vertex[j]),sizeof(D3DXVECTOR3));
memcpy(&before_f,&(Model.pobject[object_index].morph[before_frame].vertex[j]),sizeof(D3DXVECTOR3));
memcpy(&next_ft,&(Model.pobject[object_index].morph[next_frame].texcoord[j]),sizeof(D3DXVECTOR2));
memcpy(&before_ft,&(Model.pobject[object_index].morph[before_frame].texcoord[j]),sizeof(D3DXVECTOR2));
memcpy(&next_n,&(Model.pobject[object_index].morph[next_frame].normal[j]),sizeof(D3DXVECTOR3));
memcpy(&before_n,&(Model.pobject[object_index].morph[before_frame].normal[j]),sizeof(D3DXVECTOR3));
tmp.x = next_f.x - before_f.x;
tmp.y = next_f.y - before_f.y;
tmp.z = next_f.z - before_f.z;
tmp_t.x = next_ft.x - before_ft.x;
tmp_t.y = next_ft.y - before_ft.y;
tmp_n.x = next_n.x - before_n.x;
tmp_n.y = next_n.y - before_n.y;
tmp_n.z = next_n.z - before_n.z;
Model.pobject[object_index].vertex[j].x = before_f.x + tmp.x * interpol;
Model.pobject[object_index].vertex[j].y = before_f.y + tmp.y * interpol;
Model.pobject[object_index].vertex[j].z = before_f.z + tmp.z * interpol;
Model.pobject[object_index].texcoord[j].x = before_ft.x + tmp_t.x * interpol;
Model.pobject[object_index].texcoord[j].y = before_ft.y + tmp_t.y * interpol;
Model.pobject[object_index].normal[j].x = before_n.x + tmp_n.x * interpol;
Model.pobject[object_index].normal[j].y = before_n.y + tmp_n.y * interpol;
Model.pobject[object_index].normal[j].z = before_n.z + tmp_n.z * interpol;
}
return 1;
}
return 0;
}
void CEffectMesh ::CreateAniTexture(LPDIRECT3DDEVICE8 device,int obj_num) {
int tex_num = Model.pobject[obj_num].AniTexNum;
int i;
int length;
char texname[256] = {0};
strcpy(texname,Model.pmaterial[Model.pobject[obj_num].material_id].texture_file);
length = strlen(texname);
CTexture::SetPath(EFFECTTEXTUREPATH);
Model.pobject[obj_num].anitexture = new CTexture[tex_num];
for(i=0;i<tex_num;i++) {
if(i <10) {
texname[length -6] = '0';
texname[length -5] = '0' + i;
}
else if(i >=10 && i<20) {
texname[length -6] = '1';
texname[length -5] = '0' + (i - 10);
}
else if(i>=20 && i<30) {
texname[length -6] = '2';
texname[length -5] = '0' + (i - 20);
}
else if(i>=30 && i<40){
texname[length -6] = '3';
texname[length -5] = '0' + (i - 30);
}
else if(i>=40 && i<50){
texname[length -6] = '4';
texname[length -5] = '0' + (i - 40);
}
else if(i>=50 && i<60){
texname[length -6] = '5';
texname[length -5] = '0' + (i - 50);
}
else if(i>=60 && i<70){
texname[length -6] = '6';
texname[length -5] = '0' + (i - 60);
}
else if(i>=70 && i<80){
texname[length -6] = '7';
texname[length -5] = '0' + (i - 70);
}
else if(i>=80 && i<90){
texname[length -6] = '8';
texname[length -5] = '0' + (i - 80);
}
else if(i>=90 && i<100){
texname[length -6] = '9';
texname[length -5] = '0' + (i - 90);
}
Model.pobject[obj_num].anitexture[i].Load(texname);
}
}
void CEffectMesh ::CreateTexture(LPDIRECT3DDEVICE8 device) {
int i,j;
int texture_num = 0;
int mat_num = Model.material_num;
int subnum;
////////////////material num/////////////////
for(i=0;i<mat_num;i++) {
subnum = Model.pmaterial[i].sub_num;
if(subnum >0)
texture_num +=subnum;
else
texture_num++;
}
CTexture::SetPath(EFFECTTEXTUREPATH);
texture = new CTexture[texture_num];
texture_count = 0;
for(i=0;i<mat_num;i++) {
subnum = Model.pmaterial[i].sub_num;
if(subnum >0) {
for(j=0;j<subnum;j++) {
if(strlen(Model.pmaterial[i].sub[j].texture_file) >0) {
texture[texture_count].Load(Model.pmaterial[i].sub[j].texture_file);
Model.pmaterial[i].sub[j].tex_id = texture_count++;
}
else
Model.pmaterial[i].sub[j].tex_id = -1;
}
}
else {
if(strlen(Model.pmaterial[i].texture_file) >0) {
texture[texture_count].Load(Model.pmaterial[i].texture_file);
Model.pmaterial[i].tex_id = texture_count++;
}
else
Model.pmaterial[i].tex_id = -1;
}
}
}
/////////////////////////////
////////////////////////////////
void CEffectMesh::SetObjectColor(int obj_num,int r,int g,int b,int a) {
Model.pobject[obj_num].ObjectColor = D3DCOLOR_ARGB(a,r,g,b);
}
void CEffectMesh::SetPickColor(int object,int r,int g,int b,int a) {
Model.pobject[object].ObjectPickColor = D3DCOLOR_ARGB(a,r,g,b);
}
void CEffectMesh :: LoadSubface(int object_index) {
int i,j,k=0;
int tmp;
int face_num = Model.pobject[object_index].face_num;
for(i=0;i<face_num;i++) {
if(i == 0) {
j = Model.pobject[object_index].face[i].vertex_index[3];
object_sub[object_index].sub.push_back(tmp);
object_sub[object_index].sub[k] = 0;
object_sub[object_index].sub_num = 0;
object_sub[object_index].sub[k]++;
object_sub[object_index].sub_num++;
}
else if(j != Model.pobject[object_index].face[i].vertex_index[3]) {
k++;
j = Model.pobject[object_index].face[i].vertex_index[3];
object_sub[object_index].sub.push_back(tmp);
object_sub[object_index].sub_num++;
object_sub[object_index].sub[k] = 0;
object_sub[object_index].sub[k]++;
}
else {
object_sub[object_index].sub[k]++;
}
}
}