From 55f8f24d7a6214743b7dfdd47920dac46f01e1a8 Mon Sep 17 00:00:00 2001 From: Gyedo Jeon Date: Thu, 17 Jul 2008 21:45:00 +0000 Subject: [PATCH] Added support for double-sided egg flag --- pandatool/src/mayaegg/mayaEggLoader.cxx | 104 +++++++++++++++++++++++- 1 file changed, 103 insertions(+), 1 deletion(-) diff --git a/pandatool/src/mayaegg/mayaEggLoader.cxx b/pandatool/src/mayaegg/mayaEggLoader.cxx index d6218c954d..4669a62098 100755 --- a/pandatool/src/mayaegg/mayaEggLoader.cxx +++ b/pandatool/src/mayaegg/mayaEggLoader.cxx @@ -67,6 +67,7 @@ #include #include #include +#include #include "post_maya_include.h" #include "mayaEggLoader.h" @@ -147,6 +148,54 @@ MColor MakeMayaColor(const Colorf &vec) return MColor(vec[0], vec[1], vec[2], vec[3]); } +// [gjeon] to create enum attribute, +// fieldNames is a stringArray of enum names, and filedIndex is the default index value +MStatus create_enum_attribute(MObject &node, MString fullName, MString briefName, + MStringArray fieldNames, unsigned fieldIndex) { + MStatus stat; + + MFnDependencyNode fnDN( node, &stat ); + if ( MS::kSuccess != stat ) { + mayaloader_cat.error() + << "Could not create MFnDependencyNode" << "\n"; + return stat; + } + + MFnEnumAttribute fnAttr; + MObject newAttr = fnAttr.create( fullName, briefName, + 0, &stat ); + if ( MS::kSuccess != stat ) { + mayaloader_cat.error() + << "Could not create new enum attribute " << fullName << "\n"; + return stat; + } + for (unsigned i = 0; i < fieldNames.length(); i++){ + fnAttr.addField(fieldNames[i], i); + } + + stat = fnAttr.setDefault(fieldIndex); + if ( MS::kSuccess != stat ) { + mayaloader_cat.error() + << "Could not set value for enum attribute " << fullName << "\n"; + return stat; + } + + fnAttr.setKeyable( true ); + fnAttr.setReadable( true ); + fnAttr.setWritable( true ); + fnAttr.setStorable( true ); + + // Now add the new attribute to this dependency node + stat = fnDN.addAttribute(newAttr,MFnDependencyNode::kLocalDynamicAttr); + if ( MS::kSuccess != stat ) { + mayaloader_cat.error() + << "Could not add new enum attribute " << fullName << "\n"; + return stat; + } + + return stat; +} + //////////////////////////////////////////////////////////////////////////////////////////////////// // // MayaEggTex @@ -617,6 +666,7 @@ public: MIntArray _vertColorIndices; MIntArray _vertNormalIndices; + MStringArray _eggObjectTypes; VertTable _vert_tab; int GetVert(EggVertex *vert, EggGroup *context); @@ -836,6 +886,7 @@ MayaEggMesh *MayaEggLoader::GetMesh(EggVertexPool *pool, EggGroup *parent) result->_vertColorIndices.clear(); result->_faceColorArray.clear(); result->_faceIndices.clear(); + result->_eggObjectTypes.clear(); _mesh_tab[pool] = result; } return result; @@ -938,6 +989,8 @@ MayaEggNurbsSurface *MayaEggLoader::GetSurface(EggVertexPool *pool, EggGroup *pa result->_uForm = MFnNurbsSurface::kClosed; result->_vForm = MFnNurbsSurface::kClosed; + result->_eggObjectTypes.clear(); + _surface_tab[pool] = result; } return result; @@ -1254,6 +1307,21 @@ void MayaEggLoader::TraverseEggNode(EggNode *node, EggGroup *context, string del cvertIndices[0], cvertIndices[i], cvertIndices[i+1], tex); } + + // [gjeon] to handle double-sided flag + if (poly->get_bface_flag()) { + bool addNewFlag = true; + for (unsigned i = 0; i < mesh->_eggObjectTypes.length(); i++) { + if (mesh->_eggObjectTypes[i] == "double-sided") { + addNewFlag = false; + break; + } + } + if (addNewFlag) { + mesh->_eggObjectTypes.append("double-sided"); + } + } + } else if (node->is_of_type(EggNurbsSurface::get_class_type())) { // [gjeon] to convert nurbsSurface EggNurbsSurface *eggNurbsSurface = DCAST(EggNurbsSurface, node); @@ -1320,6 +1388,20 @@ void MayaEggLoader::TraverseEggNode(EggNode *node, EggGroup *context, string del surface->_vForm = MFnNurbsSurface::kOpen; } + // [gjeon] to handle double-sided flag + if (eggNurbsSurface->get_bface_flag()) { + bool addNewFlag = true; + for (unsigned i = 0; i < surface->_eggObjectTypes.length(); i++) { + if (surface->_eggObjectTypes[i] == "double-sided") { + addNewFlag = false; + break; + } + } + if (addNewFlag) { + surface->_eggObjectTypes.append("double-sided"); + } + } + } else if (node->is_of_type(EggComment::get_class_type())) { string comment = (DCAST(EggComment, node))->get_comment(); if (comment.find("2egg") != string::npos) { @@ -1461,6 +1543,17 @@ bool MayaEggLoader::ConvertEggData(EggData *data, bool merge, bool model, bool a if (mayaloader_cat.is_spam()) { mayaloader_cat.spam() << "transNode created." << endl; } + + // [gjeon] add eggFlag attributes it any exists + for (unsigned i = 0; i < mesh->_eggObjectTypes.length(); i++) { + MString attrName = "eggObjectTypes"; + attrName += (i + 1); + status = create_enum_attribute(mesh->_transNode, attrName, attrName, mesh->_eggObjectTypes, i); + if (status != MStatus::kSuccess) { + status.perror("create_enum_attribute failed!"); + } + } + mesh->_shapeNode = mfn.object(); mfn.getPath(mesh->_shape_dag_path); mesh->ConnectTextures(); @@ -1542,7 +1635,16 @@ bool MayaEggLoader::ConvertEggData(EggData *data, bool merge, bool model, bool a surface->_transNode = mfnNurbsSurface.create(surface->_cvArray, surface->_uKnotArray, surface->_vKnotArray, surface->_uDegree, surface->_vDegree, surface->_uForm, surface->_vForm, true, parent, &status); - + + // [gjeon] add eggFlag attributes it any exists + for (unsigned i = 0; i < surface->_eggObjectTypes.length(); i++) { + MString attrName = "eggObjectTypes"; + attrName += (i + 1); + status = create_enum_attribute(surface->_transNode, attrName, attrName, surface->_eggObjectTypes, i); + if (status != MStatus::kSuccess) { + status.perror("create_enum_attribute failed!"); + } + } surface->_shapeNode = mfnNurbsSurface.object(); mfnNurbsSurface.getPath(surface->_shape_dag_path); surface->ConnectTextures();