bool bgParserASE::ReadHelperObject() { bool hr = true; TCHAR szWordArray[2][MAX_PATH * 4]; D3DXVECTOR3 v3Data; FaceInfo i4Data; int iData; int iLoop, iLoopMax; int iNumObj = m_pModel->m_ObjectList.size(); m_pModel->m_ObjectList.resize(iNumObj + 1); m_pModel->m_ObjectList[iNumObj].vpObj = new HelperObject; m_pModel->m_ObjectList[iNumObj].eNodeType = OBJECT_NODE_TYPE_HELPEROBJECT; IF_FALSE_RETURN(ReadNodeInfo(iNumObj)); IF_FALSE_RETURN(FindWord(_T("*BOUNDINGBOX_MIN"))); _stscanf(m_szLine, _T("%s %f%f%f"), m_szWord, &v3Data.x, &v3Data.z, &v3Data.y); static_cast<HelperObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->vBBoxMin = v3Data; IF_FALSE_RETURN(FindWord(_T("*BOUNDINGBOX_MAX"))); _stscanf(m_szLine, _T("%s %f%f%f"), m_szWord, &v3Data.x, &v3Data.z, &v3Data.y); static_cast<HelperObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->vBBoxMax = v3Data; ///// TM_ANIMATION - 애니메이션 _tcscpy(szWordArray[0], _T("*TM_ANIMATION")); _tcscpy(szWordArray[1], _T("}")); switch (FindWordArray(szWordArray, 2)) { case 0: // *TM_ANIMATION 애니메이션이 있다면 ==================================== { m_pModel->m_ObjectList[iNumObj].bAnim = true; IF_FALSE_RETURN(ReadTMAnimation(iNumObj)); } break; case 1: // } 애니메이션 없이 끝난다면 =============================== { m_pModel->m_ObjectList[iNumObj].bAnim = false; } break; case -1: // 찾는 단어 없음 ========================================================= default: // 나머지 (배열 요소가 2개이므로 나올 수 없음) return false; break; } return hr; }
bool bgParserASE::ReadScene() { bool hr = true; IF_FALSE_RETURN(FindWord(_T("*SCENE_FIRSTFRAME"))); _stscanf(m_szLine, _T("%s %d"), m_szWord, &m_pModel->m_Scene.iFirstFrame); IF_FALSE_RETURN(FindWord(_T("*SCENE_LASTFRAME"))); _stscanf(m_szLine, _T("%s %d"), m_szWord, &m_pModel->m_Scene.iLastFrame); IF_FALSE_RETURN(FindWord(_T("*SCENE_FRAMESPEED"))); _stscanf(m_szLine, _T("%s %d"), m_szWord, &m_pModel->m_Scene.iFrameSpeed); IF_FALSE_RETURN(FindWord(_T("*SCENE_TICKSPERFRAME"))); _stscanf(m_szLine, _T("%s %d"), m_szWord, &m_pModel->m_Scene.iTicksPerFrame); IF_FALSE_RETURN(FindWord(_T("}"))); // SCENE 탈출 return hr; }
//--------------------------------------------------------------------- void LooseOctreeZone::walkOctree(const FrustumPtr & frustum, SceneNodeVector & outNodeVec) { IF_FALSE_RETURN(!isEmpty()); VisibilityType vt = frustum->isVisible(getCullAABB()); if (VT_NONE == vt) { return; } else if (VT_FULL == vt) { BOOST_FOREACH(const SceneNodePtr & node, mSceneNodeVec) { outNodeVec.push_back(node); }
bool bgParserASE::Read() { bool hr = true; TCHAR szWordArray[2][MAX_PATH * 4]; // m_ASE 데이터 초기화 ZeroMemory(&m_pModel->m_Scene, sizeof(SceneInfo)); m_pModel->m_MaterialList.clear(); m_pModel->m_ObjectList.clear(); // 파일 앞부분 1회만 등장하는 섹션 읽기 IF_FALSE_RETURN(FindWord(_T("*SCENE"))); IF_FALSE_RETURN(ReadScene()); IF_FALSE_RETURN(FindWord(_T("*MATERIAL_LIST"))); IF_FALSE_RETURN(ReadMaterial()); // 여러번 등장하는 섹션 반복해서 읽기 _tcscpy(szWordArray[0], _T("*GEOMOBJECT")); _tcscpy(szWordArray[1], _T("*HELPEROBJECT")); while (!feof(m_pFile)) { switch (FindWordArray(szWordArray, 2)) { case 0: IF_FALSE_RETURN(ReadGeomObject()); break; case 1: IF_FALSE_RETURN(ReadHelperObject()); break; case -1: // 찾는 단어 없음 (파일의 끝) { ConvertToModel(); // 읽은 데이터를 모델용 데이터로 컨버팅 LinkNode(); // 노드 관계 연결 OperationTM(); // 노드 관계에 따른 행렬 연산 } break; default: // 나머지 (배열 요소가 2개이므로 나올 수 없음) return false; break; } } return hr; }
bool bgParserASE::ReadMaterial() { bool hr = true; TCHAR szWordArray[2][MAX_PATH * 4]; int iData; int iLoop, iLoopMax; int iLoopSub, iLoopSubMax; // 최상위 메터리얼 갯수 IF_FALSE_RETURN(FindWord(_T("*MATERIAL_COUNT"))); _stscanf(m_szLine, _T("%s%d"), m_szWord, &iData); m_pModel->m_MaterialList.resize(iData); // 최상위 메터리얼 갯수만큼 반복하며 읽기 iLoopMax = m_pModel->m_MaterialList.size(); for (iLoop = 0; iLoop < iLoopMax; iLoop++) { IF_FALSE_RETURN(FindWord(_T("*MATERIAL"))); IF_FALSE_RETURN(FindWord(_T("*MATERIAL_NAME"))); ZeroMemory(m_pModel->m_MaterialList[iLoop].szMaterialName, MAX_PATH * 4); m_pszToken = _tcstok(m_szLine, _T("\"")); m_pszToken = _tcstok(NULL, _T("\"")); _tcscpy(m_pModel->m_MaterialList[iLoop].szMaterialName, m_pszToken); // 서브 메터리얼이 있는지 여부 확인 _tcscpy(szWordArray[0], _T("*NUMSUBMTLS")); _tcscpy(szWordArray[1], _T("*MAP_SUBNO")); switch (FindWordArray(szWordArray, 2)) { case 0: // *NUMSUBMTLS 서브 메터리얼이 있다면 ======================= { _stscanf(m_szLine, _T("%s%d"), m_szWord, &iData); m_pModel->m_MaterialList[iLoop].SubMaterialList.resize(iData); iLoopSubMax = m_pModel->m_MaterialList[iLoop].SubMaterialList.size(); for (iLoopSub = 0; iLoopSub < iLoopSubMax; iLoopSub++) { IF_FALSE_RETURN(FindWord(_T("*SUBMATERIAL"))); _tcscpy(szWordArray[0], _T("*MAP_SUBNO")); _tcscpy(szWordArray[1], _T("}")); switch (FindWordArray(szWordArray, 2)) { case 0: // *MAP_SUBNO MAP_SUBNO가 있다면 ------------------ { _stscanf(m_szLine, _T("%s%d"), m_szWord, &iData); // 만약 SUBNO가 1(Diffuse)가 아니면 if (iData != 1) { // 하나의 *MAP_XXX { 탈출 IF_FALSE_RETURN(FindWord(_T("}"))); continue; } _tcscpy(szWordArray[0], _T("*BITMAP")); _tcscpy(szWordArray[1], _T("}")); switch (FindWordArray(szWordArray, 2)) { case 0: // *BITMAP 비트맵이 있다면 --------------- { ZeroMemory(m_pModel->m_MaterialList[iLoop].SubMaterialList[iLoopSub].szBitmap, MAX_PATH * 4); m_pszToken = _tcstok(m_szLine, _T("\"")); m_pszToken = _tcstok(NULL, _T("\"")); _tcscpy(m_pModel->m_MaterialList[iLoop].SubMaterialList[iLoopSub].szBitmap, GetPathToFileName(m_pszToken)); // 하나의 *MAP_XXX { 탈출 IF_FALSE_RETURN(FindWord(_T("}"))); } break; case 1: // } 비트맵이 없는 메터리얼이면 ----- { } break; case -1: // 찾는 단어 없음 ----------------------------- default: // 나머지 (배열 요소가 2개이므로 나올 수 없음)--- return false; break; } } break; case 1: // } MAP_SUBNO가 없으면 ------------------ { } break; case -1: // 찾는 단어 없음 ---------------------------------------- default: // 나머지 (배열 요소가 2개이므로 나올 수 없음)-------------- return false; break; } // 하나의 *SUBMATERIAL { 탈출 IF_FALSE_RETURN(FindWord(_T("}"))); } } break; case 1: // *MAP_SUBNO 단일 메터리얼이라면 =========================== { m_pModel->m_MaterialList.resize(1); _tcscpy(szWordArray[0], _T("*BITMAP")); _tcscpy(szWordArray[1], _T("}")); switch (FindWordArray(szWordArray, 2)) { case 0: // *BITMAP 비트맵이 있다면 ------------------------ { ZeroMemory(m_pModel->m_MaterialList[iLoop].szBitmap, MAX_PATH * 4); m_pszToken = _tcstok(m_szLine, _T("\"")); m_pszToken = _tcstok(NULL, _T("\"")); _tcscpy(m_pModel->m_MaterialList[iLoop].szBitmap, GetPathToFileName(m_pszToken)); // 하나의 *MAP_XXX { 탈출 IF_FALSE_RETURN(FindWord(_T("}"))); } break; case 1: // } 비트맵이 없는 메터리얼이면 -------------- { // 해당 메터리얼 작업 } break; case -1: // 찾는 단어 없음 ------------------------------ default: // 나머지 (배열 요소가 2개이므로 나올 수 없음) return false; break; } // 하나의 *MATERIAL { 탈출 IF_FALSE_RETURN(FindWord(_T("}"))); } break; case -1: // 찾는 단어 없음 ================================================= default: // 나머지 (배열 요소가 2개이므로 나올 수 없음) return false; break; } } IF_FALSE_RETURN(FindWord(_T("}"))); // MATERIAL_LIST 탈출 return hr; }
bool bgParserASE::ReadNodeInfo(int iNumObj) { bool hr = true; TCHAR szWordArray[2][MAX_PATH * 4]; // 월드행렬 정보 저장 IF_FALSE_RETURN(FindWord(_T("*NODE_NAME"))); ZeroMemory(m_pModel->m_ObjectList[iNumObj].szNodeName, MAX_PATH * 4); m_pszToken = _tcstok(m_szLine, _T("\"")); m_pszToken = _tcstok(NULL, _T("\"")); _tcscpy(m_pModel->m_ObjectList[iNumObj].szNodeName, m_pszToken); _tcscpy(szWordArray[0], _T("*NODE_PARENT")); _tcscpy(szWordArray[1], _T("*NODE_TM")); switch (FindWordArray(szWordArray, 2)) { case 0: // *NODE_PARENT 부모 노드가 있다면 ============================ { ZeroMemory(m_pModel->m_ObjectList[iNumObj].szNodeParent, MAX_PATH * 4); m_pszToken = _tcstok(m_szLine, _T("\"")); m_pszToken = _tcstok(NULL, _T("\"")); _tcscpy(m_pModel->m_ObjectList[iNumObj].szNodeParent, m_pszToken); IF_FALSE_RETURN(FindWord(_T("*NODE_TM"))); } break; case 1: // *NODE_TM 부모 노드가 없다면 ============================ { ZeroMemory(m_pModel->m_ObjectList[iNumObj].szNodeParent, MAX_PATH * 4); m_pModel->m_ObjectList[iNumObj].pNodeParent = NULL; } break; case -1: // 찾는 단어 없음 ================================================= default: // 나머지 (배열 요소가 2개이므로 나올 수 없음) return false; break; } IF_FALSE_RETURN(FindWord(_T("*TM_ROW0"))); _stscanf(m_szLine, _T("%s %f%f%f"), m_szWord, &m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._11, &m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._13, &m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._12); m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._14 = 0.0f; IF_FALSE_RETURN(FindWord(_T("*TM_ROW1"))); _stscanf(m_szLine, _T("%s %f%f%f"), m_szWord, &m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._31, &m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._33, &m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._32); m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._34 = 0.0f; IF_FALSE_RETURN(FindWord(_T("*TM_ROW2"))); _stscanf(m_szLine, _T("%s %f%f%f"), m_szWord, &m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._21, &m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._23, &m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._22); m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._24 = 0.0f; IF_FALSE_RETURN(FindWord(_T("*TM_ROW3"))); _stscanf(m_szLine, _T("%s %f%f%f"), m_szWord, &m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._41, &m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._43, &m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._42); m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld._44 = 1.0f; // 인버스 매트릭스 확인 코드 D3DXVECTOR3 v0, v1, v2, v3; v0 = m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld.m[0]; v1 = m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld.m[1]; v2 = m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld.m[2]; D3DXVec3Cross(&v3, &v1, &v2); if (D3DXVec3Dot(&v3, &v0) < 0.0f) { D3DXMATRIX matW; D3DXMatrixScaling(&matW, -1.0f, -1.0f, -1.0f); D3DXMatrixMultiply(&m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld, &m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld, &matW); } // 분해된 월드행렬 정보 저장 float fAngle; D3DXQUATERNION qRotate; D3DXVECTOR3 vVector, vAxis; D3DXMATRIX matRotation, matRotationInv; IF_FALSE_RETURN(FindWord(_T("*TM_POS"))); _stscanf(m_szLine, _T("%s %f%f%f"), m_szWord, &vVector.x, &vVector.z, &vVector.y); m_pModel->m_ObjectList[iNumObj].nodeTM.vPos = vVector; D3DXMatrixTranslation(&m_pModel->m_ObjectList[iNumObj].matWorldPos, vVector.x, vVector.y, vVector.z); IF_FALSE_RETURN(FindWord(_T("*TM_ROTAXIS"))); _stscanf(m_szLine, _T("%s %f%f%f"), m_szWord, &vVector.x, &vVector.z, &vVector.y); m_pModel->m_ObjectList[iNumObj].nodeTM.vRotAxis = vVector; IF_FALSE_RETURN(FindWord(_T("*TM_ROTANGLE"))); _stscanf(m_szLine, _T("%s %f"), m_szWord, &fAngle); m_pModel->m_ObjectList[iNumObj].nodeTM.fRotAngle = fAngle; D3DXQuaternionRotationAxis(&qRotate, &vVector, fAngle); D3DXMatrixRotationQuaternion(&m_pModel->m_ObjectList[iNumObj].matWorldRot, &qRotate); IF_FALSE_RETURN(FindWord(_T("*TM_SCALE"))); _stscanf(m_szLine, _T("%s %f%f%f"), m_szWord, &vVector.x, &vVector.z, &vVector.y); m_pModel->m_ObjectList[iNumObj].nodeTM.vScale = vVector; D3DXMatrixScaling(&m_pModel->m_ObjectList[iNumObj].matWorldScl, vVector.x, vVector.y, vVector.z); IF_FALSE_RETURN(FindWord(_T("*TM_SCALEAXIS"))); _stscanf(m_szLine, _T("%s %f%f%f"), m_szWord, &vAxis.x, &vAxis.z, &vAxis.y); m_pModel->m_ObjectList[iNumObj].nodeTM.vScaleAxis = vAxis; IF_FALSE_RETURN(FindWord(_T("*TM_SCALEAXISANG"))); _stscanf(m_szLine, _T("%s %f"), m_szWord, &fAngle); m_pModel->m_ObjectList[iNumObj].nodeTM.fScaleAxisAngle = fAngle; D3DXMatrixRotationAxis(&matRotation, &vAxis, fAngle); D3DXMatrixInverse(&matRotationInv, NULL, &matRotation); m_pModel->m_ObjectList[iNumObj].matWorldScl = matRotationInv * m_pModel->m_ObjectList[iNumObj].matWorldScl * matRotation; IF_FALSE_RETURN(FindWord(_T("}"))); // NODE_TM 탈출 return hr; }
bool bgParserASE::ReadGeomObject() { bool hr = true; TCHAR szWordArray[2][MAX_PATH * 4]; TCHAR szCheck[MAX_PATH * 4]; D3DXVECTOR3 v3Data; FaceInfo i4Data; int iData; int iLoop, iLoopMax; int iNumObj = m_pModel->m_ObjectList.size(); m_pModel->m_ObjectList.resize(iNumObj + 1); m_pModel->m_ObjectList[iNumObj].vpObj = new GeomObject; m_pModel->m_ObjectList[iNumObj].eNodeType = OBJECT_NODE_TYPE_GEOMOBJECT; IF_FALSE_RETURN(ReadNodeInfo(iNumObj)); ///// MESH - 메쉬 데이터 IF_FALSE_RETURN(FindWord(_T("*MESH"))); IF_FALSE_RETURN(FindWord(_T("*MESH_NUMVERTEX"))); _stscanf(m_szLine, _T("%s %d"), m_szWord, &iData); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->VertexList.resize(iData); IF_FALSE_RETURN(FindWord(_T("*MESH_NUMFACES"))); _stscanf(m_szLine, _T("%s %d"), m_szWord, &iData); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->FaceList.resize(iData); ///// VERTEX_LIST - 버텍스 리스트 D3DXMATRIX matInverse; D3DXMatrixInverse(&matInverse, NULL, &m_pModel->m_ObjectList[iNumObj].nodeTM.matWorld); IF_FALSE_RETURN(FindWord(_T("*MESH_VERTEX_LIST"))); iLoopMax = static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->VertexList.size(); for (iLoop = 0; iLoop < iLoopMax; iLoop++) { IF_FALSE_RETURN(FindWord(_T("*MESH_VERTEX"))); _stscanf(m_szLine, _T("%s %d %f%f%f"), m_szWord, &iData, &v3Data.x, &v3Data.z, &v3Data.y); D3DXVec3TransformCoord(&v3Data, &v3Data, &matInverse); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->VertexList[iLoop] = v3Data; } IF_FALSE_RETURN(FindWord(_T("}"))); ///// FACE_LIST - 페이스 리스트 IF_FALSE_RETURN(FindWord(_T("*MESH_FACE_LIST"))); iLoopMax = static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->FaceList.size(); for (iLoop = 0; iLoop < iLoopMax; iLoop++) { IF_FALSE_RETURN(FindWord(_T("*MESH_FACE"))); // 1차 확인 -> *MESH_SMOOTHING 값이 존재하지 않는경우의 처리 // ex) *MESH_SMOOTHING *MESH_MTLID 10 ↓↓ _stscanf(m_szLine, _T("%s %s %s%d %s%d %s%d %s%d %s%d %s%d %s%s"), m_szWord, m_szWord, // *MESH_FACE 0: m_szWord, &i4Data.iA, // A: m_szWord, &i4Data.iC, // B: m_szWord, &i4Data.iB, // C: m_szWord, &iData, // AB: m_szWord, &iData, // BC: m_szWord, &iData, // CA: m_szWord, // *MESH_SMOOTHING szCheck); // ??? 값이 없고 바로 *MESH_MTLID 인가? // *MESH_SMOOTHING 값이 있을 경우 정상 처리 if (_tcsicmp(szCheck, _T("*MESH_MTLID"))) { _stscanf(m_szLine, _T("%s %s %s%d %s%d %s%d %s%d %s%d %s%d %s%d %s%d"), m_szWord, m_szWord, // *MESH_FACE 0: m_szWord, &i4Data.iA, // A: m_szWord, &i4Data.iC, // B: m_szWord, &i4Data.iB, // C: m_szWord, &iData, // AB: m_szWord, &iData, // BC: m_szWord, &iData, // CA: m_szWord, &iData, // *MESH_SMOOTHING m_szWord, &i4Data.iID); // *MESH_MTLID } // *MESH_SMOOTHING 값이 없을 경우 건너띄고 읽기 else { // ex) *MESH_SMOOTHING *MESH_MTLID 10 ↓↓ _stscanf(m_szLine, _T("%s %s %s%d %s%d %s%d %s%d %s%d %s%d %s %s%d"), m_szWord, m_szWord, // *MESH_FACE 0: m_szWord, &i4Data.iA, // A: m_szWord, &i4Data.iC, // B: m_szWord, &i4Data.iB, // C: m_szWord, &iData, // AB: m_szWord, &iData, // BC: m_szWord, &iData, // CA: m_szWord, // *MESH_SMOOTHING ? 생략 m_szWord, &i4Data.iID); // *MESH_MTLID } // *MTLID 값이 서브메터리얼 갯수보다 크면 0으로 처리해야함 // 메터리얼 Ref 값이 필요하므로 파일을 모두 읽은 후 컨버팅할때 처리 //if (i4Data.iID >= m_pModel->m_MaterialList[ /*MaterialRef*/ ].SubMaterialList.size()) //i4Data.iID = 0; static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->FaceList[iLoop] = i4Data; } IF_FALSE_RETURN(FindWord(_T("}"))); ///// TVERTLIST - 텍스쳐 버텍스 리스트 IF_FALSE_RETURN(FindWord(_T("*MESH_NUMTVERTEX"))); _stscanf(m_szLine, _T("%s %d"), m_szWord, &iData); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->TexVertexList.resize(iData); IF_FALSE_RETURN(FindWord(_T("*MESH_TVERTLIST"))); iLoopMax = static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->TexVertexList.size(); for (iLoop = 0; iLoop < iLoopMax; iLoop++) { IF_FALSE_RETURN(FindWord(_T("*MESH_TVERT"))); _stscanf(m_szLine, _T("%s %d %f%f%f"), m_szWord, &iData, &v3Data.x, &v3Data.y, &v3Data.z); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->TexVertexList[iLoop] = v3Data; } IF_FALSE_RETURN(FindWord(_T("}"))); ///// TFACELIST - 텍스쳐 페이스 리스트 IF_FALSE_RETURN(FindWord(_T("*MESH_NUMTVFACES"))); _stscanf(m_szLine, _T("%s %d"), m_szWord, &iData); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->TexFaceList.resize(iData); IF_FALSE_RETURN(FindWord(_T("*MESH_TFACELIST"))); iLoopMax = static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->TexFaceList.size(); for (iLoop = 0; iLoop < iLoopMax; iLoop++) { IF_FALSE_RETURN(FindWord(_T("*MESH_TFACE"))); _stscanf(m_szLine, _T("%s %d %d%d%d"), m_szWord, &iData, &i4Data.i[0], &i4Data.i[2], &i4Data.i[1]); i4Data.i[3] = 0; static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->TexFaceList[iLoop] = i4Data; } IF_FALSE_RETURN(FindWord(_T("}"))); ///// CVERTLIST - 컬러 버텍스&페이스 리스트 IF_FALSE_RETURN(FindWord(_T("*MESH_NUMCVERTEX"))); _stscanf(m_szLine, _T("%s %d"), m_szWord, &iData); // ASE 파일에 색상 정보가 없다면 임의색상 추가 if (iData == 0) { // 버텍스 컬러 iLoopMax = static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->VertexList.size(); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->ColVertexList.resize(iLoopMax); for (iLoop = 0; iLoop < iLoopMax; iLoop++) { static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->ColVertexList[iLoop] = D3DXVECTOR3(1.0f, 1.0f, 1.0f); } // 페이스 인덱스 iLoopMax = static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->FaceList.size(); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->ColFaceList.resize(iLoopMax); for (iLoop = 0; iLoop < iLoopMax; iLoop++) { // 페이스의 인덱스 번호와 동일하게 지정 static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->ColFaceList[iLoop] = static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->FaceList[iLoop]; } } // ASE 파일에 색상 정보가 있다면 해당색상 저장 else { // 버텍스 컬러 static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->ColVertexList.resize(iData); IF_FALSE_RETURN(FindWord(_T("*MESH_CVERTLIST"))); iLoopMax = static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->ColVertexList.size(); for (iLoop = 0; iLoop < iLoopMax; iLoop++) { IF_FALSE_RETURN(FindWord(_T("*MESH_VERTCOL"))); _stscanf(m_szLine, _T("%s %d %f%f%f"), m_szWord, &iData, &v3Data.x, &v3Data.y, &v3Data.z); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->ColVertexList[iLoop] = v3Data; } IF_FALSE_RETURN(FindWord(_T("}"))); // 페이스 인덱스 IF_FALSE_RETURN(FindWord(_T("*MESH_NUMCVFACES"))); _stscanf(m_szLine, _T("%s %d"), m_szWord, &iData); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->ColFaceList.resize(iData); i4Data.i[3] = 0; // 쓰지않는 [3]요소 항상 0으로 지정 IF_FALSE_RETURN(FindWord(_T("*MESH_CFACELIST"))); iLoopMax = static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->ColFaceList.size(); for (iLoop = 0; iLoop < iLoopMax; iLoop++) { IF_FALSE_RETURN(FindWord(_T("*MESH_CFACE"))); _stscanf(m_szLine, _T("%s %d %d%d%d"), m_szWord, &iData, &i4Data.i[0], &i4Data.i[2], &i4Data.i[1]); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->ColFaceList[iLoop] = i4Data; } IF_FALSE_RETURN(FindWord(_T("}"))); } ///// NORMALS - 노말 버텍스&페이스 리스트 IF_FALSE_RETURN(FindWord(_T("*MESH_NORMALS"))); iData = static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->FaceList.size(); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->NorFaceList.resize(iData); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->NorVertexList.resize(iData * 3); iLoopMax = iData; for (iLoop = 0; iLoop < iLoopMax; iLoop++) { IF_FALSE_RETURN(FindWord(_T("*MESH_FACENORMAL"))); _stscanf(m_szLine, _T("%s %d %f%f%f"), m_szWord, &iData, &v3Data.x, &v3Data.z, &v3Data.y); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->NorFaceList[iLoop] = v3Data; IF_FALSE_RETURN(FindWord(_T("*MESH_VERTEXNORMAL"))); _stscanf(m_szLine, _T("%s %d %f%f%f"), m_szWord, &iData, &v3Data.x, &v3Data.z, &v3Data.y); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->NorVertexList[iLoop * 3 + 0] = v3Data; IF_FALSE_RETURN(FindWord(_T("*MESH_VERTEXNORMAL"))); _stscanf(m_szLine, _T("%s %d %f%f%f"), m_szWord, &iData, &v3Data.x, &v3Data.z, &v3Data.y); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->NorVertexList[iLoop * 3 + 2] = v3Data; IF_FALSE_RETURN(FindWord(_T("*MESH_VERTEXNORMAL"))); _stscanf(m_szLine, _T("%s %d %f%f%f"), m_szWord, &iData, &v3Data.x, &v3Data.z, &v3Data.y); static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->NorVertexList[iLoop * 3 + 1] = v3Data; } IF_FALSE_RETURN(FindWord(_T("}"))); // MESH_NORMALS 탈출 IF_FALSE_RETURN(FindWord(_T("}"))); // MESH 탈출 ///// TM_ANIMATION - 애니메이션 _tcscpy(szWordArray[0], _T("*TM_ANIMATION")); _tcscpy(szWordArray[1], _T("*MATERIAL_REF")); switch (FindWordArray(szWordArray, 2)) { case 0: // *TM_ANIMATION 애니메이션이 있다면 ==================================== { m_pModel->m_ObjectList[iNumObj].bAnim = true; IF_FALSE_RETURN(ReadTMAnimation(iNumObj)); IF_FALSE_RETURN(FindWord(_T("*MATERIAL_REF"))); _stscanf(m_szLine, _T("%s %d"), m_szWord, &static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->iMaterialRef); } break; case 1: // *MATERIAL_REF 애니메이션 없이 곧바로 매터리얼 REF이면 ================= { m_pModel->m_ObjectList[iNumObj].bAnim = false; _stscanf(m_szLine, _T("%s %d"), m_szWord, &static_cast<GeomObject*>(m_pModel->m_ObjectList[iNumObj].vpObj)->iMaterialRef); } break; case -1: // 찾는 단어 없음 ========================================================= default: // 나머지 (배열 요소가 2개이므로 나올 수 없음) return false; break; } IF_FALSE_RETURN(FindWord(_T("}"))); // GEOMOBJECT 탈출 return hr; }