diff --git a/pandatool/src/maxegg/maxEgg.cxx b/pandatool/src/maxegg/maxEgg.cxx index 3e4bb25a0c..39ba6e6b20 100755 --- a/pandatool/src/maxegg/maxEgg.cxx +++ b/pandatool/src/maxegg/maxEgg.cxx @@ -274,17 +274,17 @@ const double meshVerts[252][3] = { This basically says "Yes, I am a helper object!" */ -class MaxEggPluginClassDesc : public ClassDesc +class MaxEggPluginClassDesc : public ClassDesc { public: int IsPublic() { return TRUE; } void *Create(BOOL loading = FALSE) { return new MaxEggPlugin(); } - const MCHAR *ClassName() { return GetString(IDS_CLASS_NAME); } + const TCHAR *ClassName() { return GetString(IDS_CLASS_NAME); } SClass_ID SuperClassID() { return HELPER_CLASS_ID; } Class_ID ClassID() { return MaxEggPlugin_CLASS_ID; } - const MCHAR *Category() { return GetString(IDS_CATEGORY); } + const TCHAR *Category() { return GetString(IDS_CATEGORY); } // returns fixed parsable name (scripter-visible name) - const MCHAR *InternalName() { return _M("MaxEggPlugin"); } + const TCHAR *InternalName() { return _T("MaxEggPlugin"); } }; // Our private global instance of the above class @@ -822,7 +822,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID lpvReserved) // This function returns a string that describes the DLL and where the user // could purchase the DLL if they don't have it. -__declspec( dllexport ) const MCHAR* LibDescription() +__declspec( dllexport ) const TCHAR* LibDescription() { return GetString(IDS_LIBDESCRIPTION); } @@ -851,9 +851,9 @@ __declspec( dllexport ) ULONG LibVersion() return VERSION_3DSMAX; } -MCHAR *GetString(int id) +TCHAR *GetString(int id) { - static MCHAR buf[256]; + static TCHAR buf[256]; if (hInstance) return LoadString(hInstance, id, buf, sizeof(buf)) ? buf : NULL; diff --git a/pandatool/src/maxegg/maxEgg.h b/pandatool/src/maxegg/maxEgg.h index 6664f6b122..4024f9f845 100755 --- a/pandatool/src/maxegg/maxEgg.h +++ b/pandatool/src/maxegg/maxEgg.h @@ -75,7 +75,7 @@ extern HINSTANCE hInstance; /* Global Functions */ -extern MCHAR *GetString(int id); +extern TCHAR *GetString(int id); /* This class defines the 3D Studio Max exporter itself. It is basically a shell that is invoked by 3D Studio Max's export API. It then sets up @@ -133,14 +133,14 @@ class MaxEggPlugin : public HelperObject void BeginEditParams( IObjParam *ip, ULONG flags,Animatable *prev); void EndEditParams( IObjParam *ip, ULONG flags,Animatable *next); #if MAX_VERSION_MAJOR < 15 - MCHAR *GetObjectName() { return GetString(IDS_LIBDESCRIPTION); } + TCHAR *GetObjectName() { return GetString(IDS_LIBDESCRIPTION); } #else - const MCHAR *GetObjectName() { return GetString(IDS_LIBDESCRIPTION); } + const TCHAR *GetObjectName() { return GetString(IDS_LIBDESCRIPTION); } #endif // From Object ObjectState Eval(TimeValue time); - void InitNodeName(MSTR& s) { s = GetString(IDS_CLASS_NAME); } + void InitNodeName(TSTR& s) { s = GetString(IDS_CLASS_NAME); } Interval ObjectValidity(TimeValue time); void Invalidate(); int DoOwnSelectHilite() { return 1; } @@ -154,8 +154,8 @@ class MaxEggPlugin : public HelperObject // Animatable methods void DeleteThis() { delete this; } Class_ID ClassID() { return MaxEggPlugin_CLASS_ID; } - void GetClassName(MSTR& s) { s = MSTR(GetString(IDS_CLASS_NAME)); } - MSTR SubAnimName(int i) { return MSTR(GetString(IDS_CLASS_NAME)); } + void GetClassName(TSTR& s) { s = TSTR(GetString(IDS_CLASS_NAME)); } + TSTR SubAnimName(int i) { return TSTR(GetString(IDS_CLASS_NAME)); } // From ref RefTargetHandle Clone(RemapDir& remap = DefaultRemapDir()); diff --git a/pandatool/src/maxegg/maxEggLoader.cxx b/pandatool/src/maxegg/maxEggLoader.cxx index b2da38f57e..e0b05657e9 100755 --- a/pandatool/src/maxegg/maxEggLoader.cxx +++ b/pandatool/src/maxegg/maxEggLoader.cxx @@ -61,7 +61,7 @@ public: MaxEggMesh *GetMesh(EggVertexPool *pool); MaxEggJoint *FindJoint(EggGroup *joint); MaxEggJoint *MakeJoint(EggGroup *joint, EggGroup *context); - MaxEggTex *GetTex(const string &fn); + MaxEggTex *GetTex(const Filename &fn); void CreateSkinModifier(MaxEggMesh *M); typedef phash_map MeshTable; @@ -91,26 +91,31 @@ Point3 MakeMaxPoint(LVector3d vec) class MaxEggTex { public: - string _path; + Filename _path; int _id; StdMat *_mat; BitmapTex *_bmt; }; -MaxEggTex *MaxEggLoader::GetTex(const string &fn) +MaxEggTex *MaxEggLoader::GetTex(const Filename &fn) { if (_tex_tab.count(fn)) return _tex_tab[fn]; BitmapTex *bmt = NewDefaultBitmapTex(); - bmt->SetMapName(MSTR::FromACP(fn.c_str())); +#ifdef _UNICODE + bmt->SetMapName(fn.to_os_specific_w().c_str()); +#else + bmt->SetMapName(fn.to_os_specific().c_str()); +#endif + StdMat *mat = NewDefaultStdMat(); mat->SetSubTexmap(ID_DI, bmt); mat->SetTexmapAmt(ID_DI, 1.0, 0); mat->EnableMap(ID_DI, TRUE); mat->SetActiveTexmap(bmt); GetCOREInterface()->ActivateTexture(bmt, mat); - + MaxEggTex *res = new MaxEggTex; res->_path = fn; res->_id = _next_tex ++; @@ -260,7 +265,7 @@ void MaxEggJoint::CreateMaxBone(void) Point3 pos(MakeMaxPoint(GetPos())); Point3 endpos(MakeMaxPoint(_endpos)); Point3 tzv(MakeMaxPoint(_perp)); - + Point3 fwd = endpos - pos; double len = fwd.Length(); Point3 txv = fwd * ((PN_stdfloat)(1.0/len)); @@ -275,16 +280,16 @@ void MaxEggJoint::CreateMaxBone(void) _node->SetNodeTM(0, Matrix3(xv, yv, zv, pos)); IParamBlock2 *blk = _bone->pblock2; for (int i=0; iNumParams(); i++) { - MSTR n = blk->GetLocalName(i); - if (_tcscmp(n, _M("Length"))==0) blk->SetValue(i,0,(PN_stdfloat)len); - else if (_tcscmp(n, _M("Width"))==0) blk->SetValue(i,0,(PN_stdfloat)_thickness); - else if (_tcscmp(n, _M("Height"))==0) blk->SetValue(i,0,(PN_stdfloat)_thickness); + TSTR n = blk->GetLocalName(i); + if (_tcscmp(n, _T("Length")) == 0) blk->SetValue(i, 0, (PN_stdfloat) len); + else if (_tcscmp(n, _T("Width")) == 0) blk->SetValue(i, 0, (PN_stdfloat) _thickness); + else if (_tcscmp(n, _T("Height")) == 0) blk->SetValue(i, 0, (PN_stdfloat) _thickness); } Point3 boneColor = GetUIColor(COLOR_BONES); _node->SetWireColor(RGB(int(boneColor.x*255.0f), int(boneColor.y*255.0f), int(boneColor.z*255.0f) )); _node->SetBoneNodeOnOff(TRUE, 0); _node->SetRenderable(FALSE); - _node->SetName(MSTR::FromACP(_egg_joint->get_name().c_str())); + _node->SetName(TSTR(_egg_joint->get_name().c_str())); _node->SetObjOffsetRot(ooquat); if (_parent) { _node->Detach(0, 1); @@ -454,7 +459,7 @@ MaxEggMesh *MaxEggLoader::GetMesh(EggVertexPool *pool) result->_tvert_count = 0; result->_cvert_count = 0; result->_face_count = 0; - result->_node->SetName(MSTR::FromACP(name.c_str())); + result->_node->SetName(TSTR(name.c_str())); _mesh_tab[pool] = result; } return result; @@ -465,7 +470,7 @@ int MaxEggMesh::AddFace(int v0, int v1, int v2, int tv0, int tv1, int tv2, int c static int dump = 0; if (_face_count == _mesh->numFaces) { int nsize = _face_count*2 + 100; - BOOL keep = _mesh->numFaces ? TRUE:FALSE; + BOOL keep = _mesh->numFaces ? TRUE : FALSE; _mesh->setNumFaces(nsize, keep); _mesh->setNumTVFaces(nsize, keep, _face_count); _mesh->setNumVCFaces(nsize, keep, _face_count); @@ -566,7 +571,7 @@ void MaxEggLoader::TraverseEggNode(EggNode *node, EggGroup *context) vector vertIndices; vector tvertIndices; vector cvertIndices; - + if (node->is_of_type(EggPolygon::get_class_type())) { EggPolygon *poly = DCAST(EggPolygon, node); @@ -574,13 +579,13 @@ void MaxEggLoader::TraverseEggNode(EggNode *node, EggGroup *context) LMatrix3d uvtrans = LMatrix3d::ident_mat(); if (poly->has_texture()) { EggTexture *tex = poly->get_texture(0); - texid = GetTex(tex->get_fullpath().to_os_specific())->_id; + texid = GetTex(tex->get_fullpath())->_id; if (tex->has_transform()) uvtrans = tex->get_transform2d(); } else { - texid = GetTex("")->_id; + texid = GetTex(Filename())->_id; } - + EggPolygon::const_iterator ci; MaxEggMesh *mesh = GetMesh(poly->get_pool()); vertIndices.clear(); @@ -621,7 +626,7 @@ bool MaxEggLoader::ConvertEggData(EggData *data, bool merge, bool model, bool an maxloader_cat.error() << "Currently, only 'merge' mode is implemented.\n"; return false; } - + if ((anim) || (!model)) { maxloader_cat.error() << "Currently, only model-loading is implemented.\n"; return false; @@ -630,14 +635,14 @@ bool MaxEggLoader::ConvertEggData(EggData *data, bool merge, bool model, bool an MeshIterator ci; JointIterator ji; TexIterator ti; - + data->set_coordinate_system(CS_zup_right); - + SuspendAnimate(); SuspendSetKeyMode(); AnimateOff(); _next_tex = 0; - + TraverseEggNode(data, NULL); for (ci = _mesh_tab.begin(); ci != _mesh_tab.end(); ++ci) { @@ -652,7 +657,7 @@ bool MaxEggLoader::ConvertEggData(EggData *data, bool merge, bool model, bool an mesh->_mesh->InvalidateGeomCache(); mesh->_mesh->buildNormals(); } - + double thickness = 0.0; for (ji = _joint_tab.begin(); ji != _joint_tab.end(); ++ji) { double dfo = ((*ji)->GetPos()).length(); @@ -664,15 +669,15 @@ bool MaxEggLoader::ConvertEggData(EggData *data, bool merge, bool model, bool an joint->ChooseEndPos(thickness); joint->CreateMaxBone(); } - + for (ci = _mesh_tab.begin(); ci != _mesh_tab.end(); ++ci) { MaxEggMesh *mesh = (*ci); EggGroup *joint = mesh->GetControlJoint(); if (joint) CreateSkinModifier(mesh); } - + if (_next_tex) { - MSTR name; + TSTR name; MultiMtl *mtl = NewDefaultMultiMtl(); mtl->SetNumSubMtls(_next_tex); for (ti = _tex_tab.begin(); ti != _tex_tab.end(); ++ti) { @@ -688,10 +693,10 @@ bool MaxEggLoader::ConvertEggData(EggData *data, bool merge, bool model, bool an for (ci = _mesh_tab.begin(); ci != _mesh_tab.end(); ++ci) delete *ci; for (ji = _joint_tab.begin(); ji != _joint_tab.end(); ++ji) delete *ji; for (ti = _tex_tab.begin(); ti != _tex_tab.end(); ++ti) delete *ti; - + ResumeSetKeyMode(); ResumeAnimate(); - + maxloader_cat.info() << "Egg import successful\n"; return true; } diff --git a/pandatool/src/maxegg/maxNodeDesc.cxx b/pandatool/src/maxegg/maxNodeDesc.cxx index 01d1b61ce7..4b82e2cbae 100755 --- a/pandatool/src/maxegg/maxNodeDesc.cxx +++ b/pandatool/src/maxegg/maxNodeDesc.cxx @@ -40,6 +40,29 @@ MaxNodeDesc(MaxNodeDesc *parent, const string &name) : } } +//////////////////////////////////////////////////////////////////// +// Function: MaxNodeDesc::Constructor +// Access: Public +// Description: This convenience constructor takes a wstring. +//////////////////////////////////////////////////////////////////// +MaxNodeDesc:: +MaxNodeDesc(MaxNodeDesc *parent, const wstring &name) : + Namable(string(name.begin(), name.end())), + _parent(parent) +{ + _max_node = (INode *)NULL; + _egg_group = (EggGroup *)NULL; + _egg_table = (EggTable *)NULL; + _anim = (EggXfmSAnim *)NULL; + _joint_type = JT_none; + _joint_entry = NULL; + + // Add ourselves to our parent. + if (_parent != (MaxNodeDesc *)NULL) { + _parent->_children.push_back(this); + } +} + //////////////////////////////////////////////////////////////////// // Function: MaxNodeDesc::Destructor // Access: Public diff --git a/pandatool/src/maxegg/maxNodeDesc.h b/pandatool/src/maxegg/maxNodeDesc.h index 00f5859efa..92cc277d35 100755 --- a/pandatool/src/maxegg/maxNodeDesc.h +++ b/pandatool/src/maxegg/maxNodeDesc.h @@ -26,6 +26,7 @@ class MaxNodeDesc : public ReferenceCount, public Namable { public: MaxNodeDesc(MaxNodeDesc *parent = NULL, const string &name = string()); + MaxNodeDesc(MaxNodeDesc *parent = NULL, const wstring &name = wstring()); ~MaxNodeDesc(); void from_INode(INode *max_node); diff --git a/pandatool/src/maxegg/maxNodeTree.cxx b/pandatool/src/maxegg/maxNodeTree.cxx index 54040b43e4..5dc88d05a4 100755 --- a/pandatool/src/maxegg/maxNodeTree.cxx +++ b/pandatool/src/maxegg/maxNodeTree.cxx @@ -15,11 +15,6 @@ #include "maxEgg.h" -// 3dsmax versions below 9 don't define this. -#ifndef _M -#define _M(s) (s) -#endif - //////////////////////////////////////////////////////////////////// // Function: MaxNodeTree::Constructor // Access: Public @@ -269,12 +264,12 @@ r_build_node(INode* max_node) { // If we have already encountered this pathname, return the // corresponding MaxNodeDesc immediately. - + ULONG node_handle = 0; - + if (max_node) { node_handle = max_node->GetHandle(); - } + } NodesByPath::const_iterator ni = _nodes_by_path.find(node_handle); if (ni != _nodes_by_path.end()) { @@ -291,7 +286,8 @@ r_build_node(INode* max_node) } else { INode *parent_node; - CStr local_name = CStr::FromMSTR(max_node->GetName()); + TSTR local_name = max_node->GetName(); + if (max_node->IsRootNode()) { parent_node = NULL; } else { @@ -315,14 +311,13 @@ r_build_node(INode* max_node) MaxNodeDesc *MaxNodeTree:: r_build_joint(MaxNodeDesc *node_desc, INode *max_node) { - CStr node_name = CStr::FromMSTR(max_node->GetName()) MaxNodeDesc *node_joint; if (node_desc == _root) { - node_joint = new MaxNodeDesc(_root, node_name); + node_joint = new MaxNodeDesc(_root, max_node->GetName()); _nodes.push_back(node_joint); return node_joint; } else if (node_desc->is_node_joint() && node_desc->_joint_entry) { - node_joint = new MaxNodeDesc(node_desc->_joint_entry, node_name); + node_joint = new MaxNodeDesc(node_desc->_joint_entry, max_node->GetName()); _nodes.push_back(node_joint); return node_joint; } else { @@ -386,56 +381,56 @@ void MaxNodeTree::set_collision_tags(MaxNodeDesc *node_desc, EggGroup *egg_group //We have to check each collision type in turn to see if it's true //Ugly but it works per object, not globaly - if (node_desc->get_max_node()->GetUserPropInt(_M("polyset"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("polyset"), check)) { //we have a polyset. if (check == 1) { egg_group->set_collision_name(node_desc->get_name()); egg_group->set_cs_type(EggGroup::CST_polyset); } } - if (node_desc->get_max_node()->GetUserPropInt(_M("plane"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("plane"), check)) { //plane if (check == 1) { egg_group->set_collision_name(node_desc->get_name()); egg_group->set_cs_type(EggGroup::CST_plane); } } - if (node_desc->get_max_node()->GetUserPropInt(_M("polygon"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("polygon"), check)) { //polygon if (check == 1) { egg_group->set_collision_name(node_desc->get_name()); egg_group->set_cs_type(EggGroup::CST_polygon); } } - if (node_desc->get_max_node()->GetUserPropInt(_M("sphere"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("sphere"), check)) { //sphere if (check == 1) { egg_group->set_collision_name(node_desc->get_name()); egg_group->set_cs_type(EggGroup::CST_sphere); } } - if (node_desc->get_max_node()->GetUserPropInt(_M("inv-sphere"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("inv-sphere"), check)) { //invsphere if (check == 1) { egg_group->set_collision_name(node_desc->get_name()); egg_group->set_cs_type(EggGroup::CST_inv_sphere); } } - if (node_desc->get_max_node()->GetUserPropInt(_M("invsphere"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("invsphere"), check)) { //invsphere (different spelling) if (check == 1) { egg_group->set_collision_name(node_desc->get_name()); egg_group->set_cs_type(EggGroup::CST_inv_sphere); } } - if (node_desc->get_max_node()->GetUserPropInt(_M("tube"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("tube"), check)) { //tube if (check == 1) { egg_group->set_collision_name(node_desc->get_name()); egg_group->set_cs_type(EggGroup::CST_tube); } } - if (node_desc->get_max_node()->GetUserPropInt(_M("floor-mesh"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("floor-mesh"), check)) { //floor-mesh if (check == 1) { egg_group->set_collision_name(node_desc->get_name()); @@ -443,49 +438,49 @@ void MaxNodeTree::set_collision_tags(MaxNodeDesc *node_desc, EggGroup *egg_group } } - if (node_desc->get_max_node()->GetUserPropInt(_M("descend"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("descend"), check)) { if (check == 1) { //we have the descend flag specified egg_group->set_collide_flags(EggGroup::CF_descend); } } - if (node_desc->get_max_node()->GetUserPropInt(_M("event"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("event"), check)) { if (check == 1) { //we have the event flag specified egg_group->set_collide_flags(EggGroup::CF_event); } } - if (node_desc->get_max_node()->GetUserPropInt(_M("keep"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("keep"), check)) { if (check == 1) { //we have the keep flag specified egg_group->set_collide_flags(EggGroup::CF_keep); } } - if (node_desc->get_max_node()->GetUserPropInt(_M("solid"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("solid"), check)) { if (check == 1) { //we have the solid flag specified egg_group->set_collide_flags(EggGroup::CF_solid); } } - if (node_desc->get_max_node()->GetUserPropInt(_M("center"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("center"), check)) { if (check == 1) { //we have the center flag specified egg_group->set_collide_flags(EggGroup::CF_center); } } - if (node_desc->get_max_node()->GetUserPropInt(_M("turnstile"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("turnstile"), check)) { if (check == 1) { //we have the turnstile flag specified egg_group->set_collide_flags(EggGroup::CF_turnstile); } } - if (node_desc->get_max_node()->GetUserPropInt(_M("level"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("level"), check)) { if (check == 1) { //we have the level flag specified egg_group->set_collide_flags(EggGroup::CF_level); } } - if (node_desc->get_max_node()->GetUserPropInt(_M("intangible"), check)) { + if (node_desc->get_max_node()->GetUserPropInt(_T("intangible"), check)) { if (check == 1) { //we have the intangible flag specified egg_group->set_collide_flags(EggGroup::CF_intangible); diff --git a/pandatool/src/maxegg/maxOptionsDialog.cxx b/pandatool/src/maxegg/maxOptionsDialog.cxx index 596c90d401..81f2481a53 100644 --- a/pandatool/src/maxegg/maxOptionsDialog.cxx +++ b/pandatool/src/maxegg/maxOptionsDialog.cxx @@ -165,8 +165,8 @@ public: ph(instance), hWnd(wnd) {} #if MAX_VERSION_MAJOR < 15 - virtual MCHAR *dialogTitle() {return _M("Objects to Export");} - virtual MCHAR *buttonText() {return _M("Select");} + virtual TCHAR *dialogTitle() {return _T("Objects to Export");} + virtual TCHAR *buttonText() {return _T("Select");} #else virtual const MCHAR *dialogTitle() {return _M("Objects to Export");} virtual const MCHAR *buttonText() {return _M("Select");} @@ -224,8 +224,8 @@ public: ph(instance), hWnd(wnd) {} #if MAX_VERSION_MAJOR < 15 - virtual MCHAR *dialogTitle() {return _M("Objects to Remove");} - virtual MCHAR *buttonText() {return _M("Remove");} + virtual TCHAR *dialogTitle() {return _T("Objects to Remove");} + virtual TCHAR *buttonText() {return _T("Remove");} #else virtual const MCHAR *dialogTitle() {return _M("Objects to Remove");} virtual const MCHAR *buttonText() {return _M("Remove");} @@ -523,7 +523,7 @@ void MaxOptionsDialog::RefreshNodeList(HWND hWnd) { SendMessage(nodeLB, LB_RESETCONTENT, 0, 0); for (int i = 0; i < _node_list.size(); i++) { INode *temp = _max_interface->GetINodeByHandle(_node_list[i]); - const MCHAR *name = _M("Unknown Node"); + const TCHAR *name = _T("Unknown Node"); if (temp) name = temp->GetName(); SendMessage(nodeLB, LB_ADDSTRING, 0, (LPARAM)name); }