#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;iRelease(); for(i=0;i= 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;idds 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;k0) { 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;jGetTransform(D3DTS_WORLD,&back); //alphatest set device->SetRenderState(D3DRS_ALPHATESTENABLE,TRUE); device->SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_GREATER); for(i=0;iSetRenderState(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 ۰¡ ÀÖÀ¸¸é ±× ۸¦ °öÇҽà °ð¹Ù·Î global ÁÂÇ¥·Î ¹Ù²î¾î //ÀÌ ÀÛ¾÷ÀÌ ÇÊ¿ä ¾ø´Ù. 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. // ºÎ¸ðÀÇ matrixÀ» °è¼Ó °öÇÑ´Ù. int kt = i; if(Model.pobject[kt].bparent) { loop=true; while(loop) { for(j=0;jSetTransform(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°¡ 0 À̸é 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 ó¸® device->BeginScene(); // tex ani´Â sub texture Áö¿ø ¾ÈÇÔ for(int k=0;k= 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=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ÃàÀÌ ¹Ý´ë·Î µÇ¹Ç·Î º¯È¯ 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); // º¹±¸ 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=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 °¡ ¾øÀ»¶§ 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=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.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;iLock(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 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=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;i0) texture_num +=subnum; else texture_num++; } CTexture::SetPath(EFFECTTEXTUREPATH); texture = new CTexture[texture_num]; texture_count = 0; for(i=0;i0) { for(j=0;j0) { 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