Skip to content

Instantly share code, notes, and snippets.

@sapper-trle
Created January 27, 2015 03:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sapper-trle/fabf082d9cae4575bfd8 to your computer and use it in GitHub Desktop.
Save sapper-trle/fabf082d9cae4575bfd8 to your computer and use it in GitHub Desktop.
Metasequoia MilkShape 3D *.ms3d Import Plugin
// 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