void SMDImporter::CreateChainFromThisNode( SMDNode* in_pNode, XSI::X3DObject in_Parent, int from) { XSI::ChainRoot myChainRoot; SMDKey *l_pKey = in_pNode->GetKey (0); for (int c=from;c<in_pNode->m_pChildren.GetUsed();c++) { XSI::MATH::CVector3 position; XSI::MATH::CVector3 positioneff; if ( l_pKey ) { position = GetGlobalPosition ( in_pNode ); positioneff = position; positioneff.PutX ( positioneff.GetX() + 1.0f ); } if (!myChainRoot.IsValid() ) { LPWSTR l_wszModelName; DSA2W(&l_wszModelName,in_pNode->m_szName); in_Parent.Add3DChain( position, positioneff, XSI::MATH::CVector3(0,0,1), l_wszModelName, myChainRoot); } SMDNode* bone = in_pNode->m_pChildren[c]; while ( bone != NULL ) { LPWSTR l_wszBoneName; DSA2W(&l_wszBoneName,bone->m_szName); SMDKey *l_pBKey = bone->GetKey (0); XSI::ChainBone myChainBone1; myChainRoot.AddBone(GetGlobalPosition(bone),XSI::siChainBonePin,l_wszBoneName,myChainBone1); if ( !bone->m_pChildren.GetUsed() ) { bone = NULL; } else { if ( bone->m_pChildren.GetUsed() > 1 ) { for (int s=1;s<bone->m_pChildren.GetUsed();s++) { CreateChainFromThisNode( bone, myChainBone1, s); } } bone = bone->GetChild(0); } } } }
//**************************************************************************************** // function : ComputeBaseOffset // description : compute the position based on the percentage along the bone // with an added offset. // // vOffeset : vector3, offset to add to final position // dtBone2LPose : double, percentage along bone length where 0 <= v <= 100 // dtBone2LPose : double, bone length // // return value : SIVector3 //**************************************************************************************** void CAxisInterpOp::ComputeBaseOffset( XSI::MATH::CVector3& rvBaseOffset, double dBonePerc, double dBoneLen ) { double delta = 0; if ( dBonePerc != 0 ) { delta = dBonePerc / 100.0; } // move the position a percentage along the bone length rvBaseOffset.PutX( rvBaseOffset.GetX() + ( dBoneLen * delta ) ); }
void SMDImporter::CreateGeometry() { if ( !m_pTriangles.GetUsed() ) return; long t; XSI::MATH::CTransformation xfo; xfo.SetRotationFromXYZAnglesValues ( -1.570796, 0.0, 0.0 ); for (t=0;t<m_pTriangles.GetUsed();t++) { for (int v=0;v<3;v++) { XSI::MATH::CVector3 vec = XSI::MATH::MapObjectPositionToWorldSpace ( xfo, m_pTriangles[t]->m_pVertex[v].m_vPosition ); long outindex; compress.AddVertex ( vec.GetX(), vec.GetY(), vec.GetZ(), m_pTriangles[t]->m_pVertex[v].m_vUV.GetX(), m_pTriangles[t]->m_pVertex[v].m_vUV.GetY(), &m_pTriangles[t]->m_pVertex[v], &outindex); m_lVertexMap.Extend(1); m_lVertexMap[m_lVertexMap.GetUsed()-1] = outindex; } } XSI::MATH::CVector3Array verts(compress.GetCount()); long vindex = 0; long cnt = compress.GetCount (); for (t=0;t<compress.GetCount ();t++) { uvvec vec; compress.GetVertex (t, &vec); verts[t] = XSI::MATH::CVector3 ( vec.x, vec.y, vec.z ); } XSI::CLongArray indices((m_pTriangles.GetUsed() * 3) + m_pTriangles.GetUsed()); long iindex = 0; char *l_szGlobalTexture = m_pTriangles[0]->m_szTexture; CSIBCArray<TriCluster> ClusterList; for (t=0;t<m_pTriangles.GetUsed();t++) { XSI::MATH::CVector3 vec1 = XSI::MATH::MapObjectPositionToWorldSpace ( xfo, m_pTriangles[t]->m_pVertex[0].m_vPosition ); XSI::MATH::CVector3 vec2 = XSI::MATH::MapObjectPositionToWorldSpace ( xfo, m_pTriangles[t]->m_pVertex[1].m_vPosition ); XSI::MATH::CVector3 vec3 = XSI::MATH::MapObjectPositionToWorldSpace ( xfo, m_pTriangles[t]->m_pVertex[2].m_vPosition ); long i1 = compress.GetIndex ( vec1.GetX(), vec1.GetY(), vec1.GetZ(), m_pTriangles[t]->m_pVertex[0].m_vUV.GetX(), m_pTriangles[t]->m_pVertex[0].m_vUV.GetY()); long i2 = compress.GetIndex ( vec2.GetX(), vec2.GetY(), vec2.GetZ(), m_pTriangles[t]->m_pVertex[1].m_vUV.GetX(), m_pTriangles[t]->m_pVertex[1].m_vUV.GetY()); long i3 = compress.GetIndex ( vec3.GetX(), vec3.GetY(), vec3.GetZ(), m_pTriangles[t]->m_pVertex[2].m_vUV.GetX(), m_pTriangles[t]->m_pVertex[2].m_vUV.GetY()); indices[iindex] = 3; indices[iindex+1] = i1; indices[iindex+2] = i2; indices[iindex+3] = i3; iindex += 4; if ( strcmp ( l_szGlobalTexture, m_pTriangles[t]->m_szTexture )) { // // found a local material // TriCluster* cls = NULL; for (int c=0;c<ClusterList.GetUsed();c++) { if ( !strcmp ( ClusterList[c].m_szName, m_pTriangles[t]->m_szTexture)) { cls = &ClusterList[c]; break; } } if ( cls == NULL ) { ClusterList.Extend(1); strcpy ( ClusterList[ClusterList.GetUsed()-1].m_szName, m_pTriangles[t]->m_szTexture ); cls = &ClusterList[ClusterList.GetUsed()-1]; } cls->m_indices.Add ( t ); } } char mname[1024]; sprintf (mname, "mesh" ); if ( m_pMeshNode ) { sprintf (mname, FixName(m_pMeshNode->m_szName)); } LPWSTR l_wszModelName; DSA2W(&l_wszModelName,mname); m_pModel.AddPolygonMesh ( verts, indices, l_wszModelName, m_pMesh ); XSI::Application app; XSI::CValueArray args(4); XSI::CValue outArg; XSI::CStatus st; args[0] = XSI::CValue( XSI::CString(L"") ); args[1] = XSI::CValue(false); args[0] = XSI::CValue(m_pMesh.GetRef()); args[1] = XSI::CValue((long)XSI::siTxtUV); args[2] = XSI::CValue((long)XSI::siTxtDefaultSpherical); args[3] = XSI::CValue(XSI::CString(L"Texture_Support")); app.ExecuteCommand( L"CreateTextureSupport", args, outArg ); XSI::CValueArray moreargs(1); XSI::CValueArray moreoutargs(3); moreargs[0] = m_pMesh.GetRef(); app.ExecuteCommand(L"FreezeObj",moreargs, outArg); XSI::Material l_matMaterial; st = m_pMesh.AddMaterial(L"Phong", true, L"CubeMat", l_matMaterial); XSI::OGLTexture l_oglTexture(l_matMaterial.GetOGLTexture()); XSI::CString l_szFullNameDefaultOut = l_oglTexture.GetFullName(); int l_nHeightDefaultOut = l_oglTexture.GetHeight(); int l_nWidthDefaultOut = l_oglTexture.GetWidth(); // Now actually add a texture, so we can test it. args[0] = XSI::CValue( XSI::CString(L"Image") ); args[1] = XSI::CValue(m_pMesh.GetRef()); args[2] = XSI::CValue((short)1); args[3] = XSI::CValue(false); st = app.ExecuteCommand( L"BlendInPresets", args, outArg ); // // create the texture and connect // XSI::CValueArray clipargs(3); XSI::ImageClip2 l_pClip; char l_szTextureFullname[1024]; sprintf ( l_szTextureFullname, "%s%s", m_szDirectory, m_pTriangles[0]->m_szTexture); char clipname[1024]; _splitpath ( m_pTriangles[0]->m_szTexture, NULL, NULL, clipname, NULL ); LPWSTR l_wszClipName; DSA2W(&l_wszClipName,l_szTextureFullname); LPWSTR l_wszClipName2; DSA2W(&l_wszClipName2,clipname); clipargs[0] = XSI::CValue( XSI::CString(l_wszClipName) ); clipargs[1] = XSI::CValue( XSI::CString(l_wszClipName2) ); clipargs[2] = XSI::CValue(l_pClip.GetRef()); app.ExecuteCommand( L"SICreateImageClip", clipargs, outArg ); XSI::CString l_szMaterialName = l_matMaterial.GetFullName(); XSI::CString l_szImageNode = l_szMaterialName + L".CubeMat.ambient_blend.Image.tex"; XSI::CString l_szFullclipname = L"Clips." + XSI::CString(l_wszClipName2); XSI::CValueArray clipargs2(2); clipargs2[0] = XSI::CValue( XSI::CString(l_szFullclipname) ); clipargs2[1] = XSI::CValue( XSI::CString(l_szImageNode) ); app.ExecuteCommand( L"SIConnectShaderToCnxPoint", clipargs2, outArg ); // // Create all clusters // XSI::Geometry geom( m_pMesh.GetActivePrimitive().GetGeometry() ); for (int b=0;b<ClusterList.GetUsed();b++) { TriCluster* cls = &ClusterList[b]; sprintf ( l_szTextureFullname, "%s%s", m_szDirectory, cls->m_szName); _splitpath ( cls->m_szName, NULL, NULL, clipname, NULL ); DSA2W(&l_wszClipName,l_szTextureFullname); DSA2W(&l_wszClipName2,clipname); XSI::CLongArray array; XSI::Cluster polyCluster ; geom.AddCluster( XSI::siPolygonCluster, l_wszClipName2, cls->m_indices, polyCluster ) ; st = polyCluster.AddMaterial(L"Phong", true, L"CubeMat", l_matMaterial); XSI::OGLTexture l_oglTexture(l_matMaterial.GetOGLTexture()); // Now actually add a texture, so we can test it. args[0] = XSI::CValue( XSI::CString(L"Image") ); args[1] = XSI::CValue(polyCluster.GetRef()); args[2] = XSI::CValue((short)1); args[3] = XSI::CValue(false); st = app.ExecuteCommand( L"BlendInPresets", args, outArg ); clipargs[0] = XSI::CValue( XSI::CString(l_wszClipName) ); clipargs[1] = XSI::CValue( XSI::CString(l_wszClipName2) ); clipargs[2] = XSI::CValue(l_pClip.GetRef()); app.ExecuteCommand( L"SICreateImageClip", clipargs, outArg ); l_szMaterialName = l_matMaterial.GetFullName(); l_szImageNode = l_szMaterialName + L".CubeMat.ambient_blend.Image.tex"; l_szFullclipname = L"Clips." + XSI::CString(l_wszClipName2); clipargs2[0] = XSI::CValue( XSI::CString(l_szFullclipname) ); clipargs2[1] = XSI::CValue( XSI::CString(l_szImageNode) ); app.ExecuteCommand( L"SIConnectShaderToCnxPoint", clipargs2, outArg ); } if ( m_pMesh.IsValid () ) { XSI::Geometry geom( m_pMesh.GetActivePrimitive().GetGeometry() ); XSI::PolygonMesh mesh(m_pMesh.GetActivePrimitive().GetGeometry()); XSI::CPointRefArray Geompoints = geom.GetPoints(); XSI::CTriangleRefArray triangles(geom.GetTriangles()); XSI::ClusterProperty UVWProp(m_pMesh.GetMaterial().GetCurrentUV()); if ( UVWProp.IsValid() ) { XSI::CClusterPropertyElementArray clusterPropertyElements = UVWProp.GetElements(); XSI::CDoubleArray elementArray = clusterPropertyElements.GetArray(); long totalUvCount = elementArray.GetCount (); int cc=0; int uvc = 0; for (int c=0;c<m_pTriangles.GetUsed();c++) { long l_iNumVertex = indices[cc]; cc++; for (int i=0;i<l_iNumVertex;i++) { long l_iID = indices[cc]; cc++; uvvec vec; compress.GetVertex (l_iID, &vec); elementArray[ uvc * 3 ] = vec.u; elementArray[ (uvc * 3) + 1] = vec.v; elementArray[ (uvc * 3) + 2] = 0.0f; uvc++; } } clusterPropertyElements.PutArray(elementArray); } } }
void TXGLPoint::SetPos(XSI::MATH::CVector3& pos) { m_pos[0] = (GLfloat)pos.GetX(); m_pos[1] = (GLfloat)pos.GetY(); m_pos[2] = (GLfloat)pos.GetZ(); }