Created
January 27, 2015 03:48
-
-
Save sapper-trle/fabf082d9cae4575bfd8 to your computer and use it in GitHub Desktop.
Metasequoia MilkShape 3D *.ms3d Import Plugin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Metasequoia MilkShape 3D *.ms3d Import Plugin | |
// Requires msViewer2.zip from Milkshape 3D | |
#define WIN32_LEAN_AND_MEAN | |
#include <windows.h> | |
#include <cstdio> | |
#include <cstdlib> | |
#include <vector> | |
#include "msModel.h" // msViewer2.zip | |
#include "MQPlugin.h" // mqsdk | |
BOOL LoadMS3D(const char *filename, MQDocument doc); | |
MQPLUGIN_EXPORT void MQGetPlugInID(DWORD *Product, DWORD *ID) | |
{ | |
*Product = 0xc0cca200; | |
*ID = 0x00000002; | |
} | |
MQPLUGIN_EXPORT const char *MQGetPlugInName(void) | |
{ | |
return "Milkshape 3D MS3D Importer by sapper using code by Mete Ciragan"; | |
} | |
MQPLUGIN_EXPORT int MQGetPlugInType(void) | |
{ | |
return MQPLUGIN_TYPE_IMPORT; | |
} | |
MQPLUGIN_EXPORT const char *MQEnumFileType(int index) | |
{ | |
switch (index){ | |
case 0: return "MilkShape 3D (*.ms3d)"; | |
} | |
return NULL; | |
} | |
MQPLUGIN_EXPORT const char *MQEnumFileExt(int index) | |
{ | |
switch (index){ | |
case 0: return "ms3d"; | |
} | |
return NULL; | |
} | |
MQPLUGIN_EXPORT BOOL MQImportFile(int index, const char *filename, MQDocument doc) | |
{ | |
switch (index){ | |
case 0: return LoadMS3D(filename, doc); | |
} | |
return FALSE; | |
} | |
BOOL ConvertToMQ(const char* filename, msModel* m, MQDocument doc, float scale); | |
BOOL LoadMS3D(const char *filename, MQDocument doc) | |
{ | |
msModel model; | |
model.Clear(); | |
MQFileDialogInfo info; | |
memset(&info, 0, sizeof(info)); | |
info.dwSize = sizeof(info); | |
info.hidden_flag = info.HIDDEN_INVERT_FACE | info.HIDDEN_AXIS; | |
//info.softname = "3ds"; // See /data/english/Axisinfo.txt for string to use | |
MQ_ShowFileDialog("MS3D", &info); | |
float scale = info.scale; | |
if (model.Load(filename)) | |
{ | |
if (ConvertToMQ(filename, &model, doc, scale)) | |
{ | |
return TRUE; | |
} | |
} | |
return FALSE; | |
} | |
MQColor toMQCol(float a[4]) | |
{ | |
return MQColor(a[0],a[1],a[2]); | |
} | |
BOOL ConvertToMQ(const char* filename, msModel* m, MQDocument doc, float scale) | |
{ | |
MQObject obj = MQ_CreateObject(); | |
MQMatrix matrix = MQMatrix(); | |
matrix.Identify(); | |
MQPoint S = MQPoint(scale, scale, scale); | |
MQAngle R = MQAngle(0.0f, 0.0f, 0.0f); | |
MQPoint T = MQPoint(0.0f, 0.0f, 0.0f); | |
matrix.SetTransform(&S, &R, &T); | |
MQPoint p; | |
ms3d_vertex_t* v; | |
for (int i = 0; i < m->GetNumVertices(); ++i) | |
{ | |
v = m->GetVertex(i); | |
p.x = v->vertex[0]; | |
p.y = v->vertex[1]; | |
p.z = v->vertex[2]; | |
obj->AddVertex(p*matrix); | |
} | |
if (obj->GetVertexCount() == 0) | |
{ | |
obj->DeleteThis(); | |
return FALSE; | |
} | |
int temparray[3]; | |
ms3d_triangle_t* t; | |
MQCoordinate uv; | |
MQCoordinate uvarray[3]; | |
for (int i = 0; i < m->GetNumTriangles(); ++i) | |
{ | |
t = m->GetTriangle(i); | |
temparray[0] = t->vertexIndices[0]; | |
temparray[1] = t->vertexIndices[1]; | |
temparray[2] = t->vertexIndices[2]; | |
for (int j = 0; j < 3; ++j) | |
{ | |
uv.u = t->s[j]; | |
uv.v = t->t[j]; | |
uvarray[j] = uv; | |
} | |
obj->AddFace(3, temparray); | |
obj->SetFaceCoordinateArray(i, uvarray); | |
obj->InvertFace(i); | |
} | |
if (obj->GetFaceCount() == 0) | |
{ | |
obj->DeleteThis(); | |
return FALSE; | |
} | |
obj->OptimizeVertex(0.0001f, NULL); | |
ms3d_group_t* g; | |
for (int i = 0; i < m->GetNumGroups(); ++i) | |
{ | |
g = m->GetGroup(i); | |
for (unsigned int j = 0; j < g->triangleIndices.size(); ++j) | |
{ | |
obj->SetFaceMaterial(g->triangleIndices[j], g->materialIndex); | |
} | |
} | |
MQObject ob = MQ_CreateObject(); | |
char drive[_MAX_DRIVE]; | |
char dir[_MAX_DIR]; | |
char fname[_MAX_FNAME]; | |
char ext[_MAX_EXT]; | |
_splitpath(filename,drive,dir,fname,ext); | |
ob->SetName(fname); | |
int obindex = doc->AddObject(ob); | |
for (int i = 0; i < m->GetNumGroups(); ++i) | |
{ | |
g = m->GetGroup(i); | |
MQObject objclone = obj->Clone(); | |
for (int j = 0; j < objclone->GetFaceCount(); ++j) | |
{ | |
bool found = false; | |
for (std::vector<unsigned short>::iterator it = g->triangleIndices.begin(); it != g->triangleIndices.end(); ++it) | |
{ | |
if (*it == j) | |
{ | |
found = true; | |
break; | |
} | |
} | |
if (!found) | |
{ | |
objclone->DeleteFace(j); | |
} | |
} | |
objclone->Compact(); | |
objclone->SetName(g->name); | |
doc->AddObject(objclone); | |
objclone->SetDepth(1); | |
} | |
obj->DeleteThis(); | |
ms3d_material_t* msmat; | |
MQColor col; | |
for (int i = 0; i < m->GetNumMaterials(); ++i) | |
{ | |
msmat = m->GetMaterial(i); | |
MQMaterial mqmat = MQ_CreateMaterial(); | |
mqmat->SetName(msmat->name); | |
mqmat->SetTextureName(msmat->texture); | |
mqmat->SetAlphaName(msmat->alphamap); | |
mqmat->SetAlpha(msmat->transparency); | |
col = toMQCol(msmat->diffuse); | |
mqmat->SetColor(col); | |
col = toMQCol(msmat->emissive); | |
mqmat->SetEmissionColor(col); | |
col = toMQCol(msmat->specular); | |
mqmat->SetSpecularColor(col); | |
col = toMQCol(msmat->ambient); | |
mqmat->SetAmbientColor(col); | |
//mqmat->SetPower(msmat->shininess*100/128); //unsure | |
doc->AddMaterial(mqmat); | |
} | |
//doc->SetCurrentObjectIndex(obindex); // not needed | |
return TRUE; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment