XSIPLUGINCALLBACK CStatus OutputMaterials( Selection& in_sel ) { // prepare the mtl file Project prj = app.GetActiveProject(); Scene scn = prj.GetActiveScene(); CString tmpLocation = Get3DCoatParam( L"tempLocation" ).GetValue(); ULONG npos = tmpLocation.ReverseFindString(L"."); CString substr = tmpLocation.GetSubString(0, npos+1); CString strOut = substr + L"mtl"; //app.LogMessage(L"strOut:" + strOut); std::ofstream matfw; matfw.open(strOut.GetAsciiString(), std::ios_base::out | std::ios_base::trunc); if (matfw.is_open()) { CRefArray tempMats; for(int i=0; i< in_sel.GetCount(); i++) { X3DObject xobj(in_sel.GetItem(i)); // Get a geometry accessor from the selected object Primitive prim = xobj.GetActivePrimitive(); PolygonMesh mesh = prim.GetGeometry(); if (!mesh.IsValid()) return CStatus::False; CGeometryAccessor ga = mesh.GetGeometryAccessor(); // get the material objects used by the mesh CRefArray materials = ga.GetMaterials(); for (LONG n=0; n < materials.GetCount(); n++) { bar.PutStatusText( L"materials" ); Material mat(materials[n]); bool inMats = false; //app.LogMessage(CString(n) +L" : "+ CString(i)+ L" :" + mat.GetName()); for(int m = 0; m < tempMats.GetCount(); m++) { Material tmat(tempMats[m]); if(mat.GetName() == tmat.GetName()) { inMats = true; break; } } //app.LogMessage(CString(inMats)); if(!inMats) { CString string = L"newmtl " + mat.GetName() + L"\n"; matfw << string.GetAsciiString(); Parameter surf = mat.GetParameters().GetItem(L"surface"); Shader lShader(surf.GetSource()); //app.LogMessage(L"shader: " + lShader.GetFullName()); //app.LogMessage(L"shader: " + lShader.GetProgID()); if ( lShader.GetProgID() == L"Softimage.material-phong.1" ) { float r, g, b, a; lShader.GetColorParameterValue(L"ambient", r, g, b, a ); CString ka = L"Ka " + FormatNumber(r) + L" " + FormatNumber(g) + L" " + FormatNumber(b); lShader.GetColorParameterValue(L"diffuse", r, g, b, a ); CString kd = L"Kd " + FormatNumber(r) + L" " + FormatNumber(g) + L" " + FormatNumber(b); lShader.GetColorParameterValue(L"specular", r, g, b, a ); CString ks = L"Ks " + FormatNumber(r) + L" " + FormatNumber(g) + L" " + FormatNumber(b); float ns = lShader.GetParameterValue(L"shiny"); float d = 1.0f; CValue illum = 2; matfw << ka.GetAsciiString(); matfw << "\n"; matfw << kd.GetAsciiString(); matfw << "\n"; matfw << ks.GetAsciiString(); matfw << "\n"; matfw << "Ns "; matfw << FormatNumber(ns).GetAsciiString(); matfw << "\n"; matfw << "d "; matfw << FormatNumber(d).GetAsciiString(); matfw << "\n"; matfw << "illum "; matfw << illum.GetAsText().GetAsciiString(); matfw << "\n"; Parameter diff = lShader.GetParameters().GetItem(L"diffuse"); Shader lImageD(diff.GetSource()); if (lImageD.GetProgID() == L"Softimage.txt2d-image-explicit.1") { Parameter tex = lImageD.GetParameters().GetItem(L"tex"); ImageClip2 lTextureD(tex.GetSource()); //app.LogMessage( L"Found texture shader: " + lTexture.GetFullName() + L", Class: " + lTexture.GetClassIDName() + L", Type: " + lTexture.GetType() ); app.LogMessage(L"texture GetFileName: " + lTextureD.GetFileName()); matfw << "map_Kd "; matfw << lTextureD.GetFileName().GetAsciiString(); matfw << "\n"; } Parameter spec = lShader.GetParameters().GetItem(L"specular"); Shader lImageS(spec.GetSource()); if (lImageS.GetProgID() == L"Softimage.txt2d-image-explicit.1") { Parameter tex = lImageD.GetParameters().GetItem(L"tex"); ImageClip2 lTextureS(tex.GetSource()); //app.LogMessage( L"Found texture shader: " + lTexture.GetFullName() + L", Class: " + lTexture.GetClassIDName() + L", Type: " + lTexture.GetType() ); //app.LogMessage(L"texture GetFileName: " + lTexture.GetFileName()); matfw << "map_Ks "; matfw << lTextureS.GetFileName().GetAsciiString(); matfw << "\n"; } } tempMats.Add(mat); matfw << "\n"; matfw << "\n"; } } } matfw.close(); } return CStatus::OK; }
XSIPLUGINCALLBACK CStatus Coat3DExport_Execute( CRef& in_ctxt ) { // Unpack the command argument values Context ctxt( in_ctxt ); CValueArray args = ctxt.GetAttribute(L"Arguments"); CString string; // A 3d object with a mesh geometry must be selected Selection selection(app.GetSelection()); bool isPolymesh = true; for(int i =0; i< selection.GetCount(); i++) { X3DObject obj(selection[i]); //app.LogMessage(L"obj.IsA(siPolygonMeshID): " + CString(obj.GetType())); if(obj.GetType() != L"polymsh" ) { isPolymesh = false; break; } } if (selection.GetCount() > 0 && isPolymesh) { gV = 0; gVn = 0; gVt = 0; gVprev = 0; gVnPrev = 0; gVtPrev = 0; // prepare the output text file CString strOut = Get3DCoatParam( L"tempLocation" ).GetValue(); std::ofstream mfw; mfw.open(strOut.GetAsciiString(), std::ios_base::out | std::ios_base::trunc); if (mfw.is_open()) { bar.PutMaximum( selection.GetCount() ); bar.PutStep( 1 ); bar.PutVisible( true ); OutputHeader( mfw); // output the data for (int i=0; i < selection.GetCount(); i++) { gObjCnt = i; gVprev = gV; gVtPrev = gVt; gVnPrev = gVn; X3DObject xobj(selection.GetItem(i)); bar.PutValue(i); bar.PutCaption( L"Exporting " + xobj.GetName()); mfw << "\n"; mfw << "# Hierarchy (from self to top father)\n"; string = L"g " + xobj.GetName() + L"\n"; mfw << string.GetAsciiString(); mfw << "\n"; // Get a geometry accessor from the selected object Primitive prim = xobj.GetActivePrimitive(); PolygonMesh mesh = prim.GetGeometry(); if (!mesh.IsValid()) return CStatus::False; CGeometryAccessor ga = mesh.GetGeometryAccessor(); OutputVertices( mfw, ga, xobj ); if (bar.IsCancelPressed()) return CStatus::False; OutputPolygonComponents( mfw, ga ); if (bar.IsCancelPressed()) return CStatus::False; //bar.Increment(); } } mfw.close(); if(Get3DCoatParam(L"bExpMat").GetValue()) { OutputMaterials(selection ); } bar.PutStatusText( L"import.txt" ); OutputImportTxt(); bar.PutVisible(false); app.LogMessage(L"Export done!"); } else { app.LogMessage(L"Please, select objects!", siWarningMsg); return CStatus::False; } return CStatus::OK; }
nurbMeshData::nurbMeshData( const Primitive &nurbMeshPrim, double atTime, bool usePref, double atPrefTime ) { globals& g = const_cast< globals& >( globals::access() ); NurbsSurfaceMesh nurbSurfaceMesh( nurbMeshPrim.GetGeometry( atTime ) ); identifier = getAffogatoName( CStringToString( X3DObject( nurbMeshPrim.GetParent() ).GetFullName() ) ); // Add two surfaces to the mesh. CNurbsSurfaceDataArray nurbSurfaceDataArray; nurbSurfaceMesh.Get( siIGESNurbs, nurbSurfaceDataArray ); // set the type of geometry if( g.geometry.nonRationalNurbSurface ) tokenValuePtrArray.push_back( tokenValue::tokenValuePtr( new tokenValue( nurbSurfaceDataArray[ 0 ].m_aControlPoints, "P", tokenValue::storageVertex, tokenValue::typePoint ) ) ); else tokenValuePtrArray.push_back( tokenValue::tokenValuePtr( new tokenValue( nurbSurfaceDataArray[ 0 ].m_aControlPoints, "Pw" ) ) ); if( usePref ) { NurbsSurfaceMesh nurbSurfaceMeshPref = nurbMeshPrim.GetGeometry( atPrefTime ); nurbSurfaceMeshPref.Get( siIGESNurbs, nurbSurfaceDataArray ); if( g.geometry.nonRationalNurbSurface ) tokenValuePtrArray.push_back( tokenValue::tokenValuePtr( new tokenValue( nurbSurfaceDataArray[ 0 ].m_aControlPoints, "__Pref", tokenValue::storageVertex, tokenValue::typePoint ) ) ); else tokenValuePtrArray.push_back( tokenValue::tokenValuePtr( new tokenValue( nurbSurfaceDataArray[ 0 ].m_aControlPoints, "__Pref" ) ) ); } // grab the order information uOrder = nurbSurfaceDataArray[ 0 ].m_lUDegree + 1; vOrder = nurbSurfaceDataArray[ 0 ].m_lVDegree + 1; numCVsU = nurbSurfaceDataArray[ 0 ].m_lNbUControlPoints; numCVsV = nurbSurfaceDataArray[ 0 ].m_lNbVControlPoints; int numKnotsU = nurbSurfaceDataArray[ 0 ].m_aUKnots.GetCount(); uKnot = new float[ numKnotsU ]; for( int knot = 0; knot < numKnotsU; knot++ ) uKnot[ knot ] = ( float )nurbSurfaceDataArray[ 0 ].m_aUKnots[ knot ]; int numKnotsV = nurbSurfaceDataArray[ 0 ].m_aVKnots.GetCount(); vKnot = new float[ numKnotsV ]; for( int knot = 0; knot < numKnotsV; knot++ ) vKnot[ knot ] = ( float )nurbSurfaceDataArray[ 0 ].m_aVKnots[ knot ]; if( g.geometry.normalizeNurbKnotVector ) { float start; float scale; // U if( nurbSurfaceDataArray[ 0 ].m_bUClosed ) { start = uKnot[ 3 ]; scale = 1 / ( uKnot[ numKnotsU - 4 ] - start ); } else { start = uKnot[ 0 ]; scale = 1 / ( uKnot[ numKnotsU - 1 ] - start ); } for( int knot = 0; knot < numKnotsU; knot++ ) uKnot[ knot ] = ( uKnot[ knot ] - start ) * scale; // V if( nurbSurfaceDataArray[ 0 ].m_bVClosed ) { start = vKnot[ 3 ]; scale = 1 / ( vKnot[ numKnotsV - 4 ] - start ); } else { start = vKnot[ 0 ]; scale = 1 / ( vKnot[ numKnotsV - 1 ] - start ); } for( int knot = 0; knot < numKnotsV; knot++ ) vKnot[ knot ] = ( vKnot[ knot ] - start ) * scale; } uMin = uKnot[ uOrder - 1 ]; uMax = uKnot[ numKnotsU - uOrder ]; vMin = vKnot[ vOrder - 1 ]; vMax = vKnot[ numKnotsV - vOrder ]; if( g.animation.time == atTime ) { bound = affogato::getBoundingBox( nurbMeshPrim, atTime ); } else { bound.resize( 6 ); bound[ 5 ] = bound[ 3 ] = bound[ 1 ] = numeric_limits< float >::max(); bound[ 0 ] = bound[ 2 ] = bound[ 4 ] = numeric_limits< float >::min(); } }