more compatibility fixes

This commit is contained in:
rdb 2013-10-23 16:48:22 +00:00
parent d899d8e6ed
commit 3841accba9
7 changed files with 97 additions and 73 deletions

View File

@ -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;

View File

@ -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());

View File

@ -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<EggVertexPool *, MaxEggMesh *> 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; i<blk->NumParams(); 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<int> vertIndices;
vector<int> tvertIndices;
vector<int> 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;
}

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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);
}