private void ImportBrgMesh(string mainObject, BrgMesh mesh, float time)
{
string vertArray = "";
string normArray = "";
string texVerts = "";
string faceMats = "";
string faceArray = "";
if (!mesh.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH))
{
vertArray = Maxscript.NewArray("vertArray");
normArray = Maxscript.NewArray("normArray");
texVerts = Maxscript.NewArray("texVerts");
faceMats = Maxscript.NewArray("faceMats");
faceArray = Maxscript.NewArray("faceArray");
}
Maxscript.CommentTitle("Load Vertices/Normals/UVWs");
Maxscript.Command("uvwSetVertPosFunc = {0}.Unwrap_UVW.SetVertexPosition", mainObject);
for (int i = 0; i < mesh.Vertices.Count; i++)
{
if (mesh.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH))
{
Maxscript.AnimateAtTime(time, "meshSetVertFunc {0} {1} {2}", mainObject, i + 1,
Maxscript.Point3Literal(-mesh.Vertices[i].X, -mesh.Vertices[i].Z, mesh.Vertices[i].Y));
if (mesh.Header.Flags.HasFlag(BrgMeshFlag.ANIMTEXCOORDS) &&
mesh.Header.Flags.HasFlag(BrgMeshFlag.TEXCOORDSA))
{
Maxscript.Animate("uvwSetVertPosFunc {0}s {1} {2}", time, i + 1,
Maxscript.Point3Literal(mesh.TextureCoordinates[i].X, mesh.TextureCoordinates[i].Y, 0));
}
if (mesh.Header.Flags.HasFlag(BrgMeshFlag.ANIMVERTCOLORALPHA))
{
if (mesh.Header.Flags.HasFlag(BrgMeshFlag.COLORALPHACHANNEL))
{
Maxscript.AnimateAtTime(time, "meshop.setVertAlpha {0} -2 {1} {2}",
mainObject, i + 1, mesh.Colors[i].A);
}
else if (mesh.Header.Flags.HasFlag(BrgMeshFlag.COLORCHANNEL))
{
Maxscript.AnimateAtTime(time, "meshop.setVertColor {0} 0 {1} (color {2} {3} {4})", mainObject, i + 1,
mesh.Colors[i].R, mesh.Colors[i].G, mesh.Colors[i].B);
}
}
}
else
{
Maxscript.Append(vertArray, Maxscript.Point3Literal(-mesh.Vertices[i].X, -mesh.Vertices[i].Z, mesh.Vertices[i].Y));
if (mesh.Header.Flags.HasFlag(BrgMeshFlag.TEXCOORDSA))
{
Maxscript.Append(texVerts, Maxscript.Point3Literal(mesh.TextureCoordinates[i].X, mesh.TextureCoordinates[i].Y, 0));
}
if (mesh.Header.Flags.HasFlag(BrgMeshFlag.COLORALPHACHANNEL))
{
//Maxscript.Command("meshop.supportVAlphas {0}", mainObject);
Maxscript.Command("meshop.setVertAlpha {0} -2 {1} {2}",
mainObject, i + 1, mesh.Colors[i].A);
}
else if (mesh.Header.Flags.HasFlag(BrgMeshFlag.COLORCHANNEL))
{
Maxscript.Command("meshop.setVertColor {0} 0 {1} (color {2} {3} {4})", mainObject, i + 1,
mesh.Colors[i].R, mesh.Colors[i].G, mesh.Colors[i].B);
}
}
}
if (!mesh.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH))
{
if (mesh.Header.Flags.HasFlag(BrgMeshFlag.MATERIAL))
{
Maxscript.CommentTitle("Load Face Materials");
foreach (var fMat in mesh.Faces)
{
Maxscript.Append(faceMats, fMat.MaterialIndex);
}
}
Maxscript.CommentTitle("Load Faces");
foreach (var face in mesh.Faces)
{
Maxscript.Append(faceArray, Maxscript.Point3Literal(face.Indices[0] + 1, face.Indices[2] + 1, face.Indices[1] + 1));
}
int mObjNum = 0;
while (Maxscript.QueryInteger("($objects/{0}* as array).count", mainObject + mObjNum) > 0) { ++mObjNum; }
Maxscript.Command("{0} = {1}", mainObject, Maxscript.NewMeshLiteral(mainObject + mObjNum, vertArray, faceArray, faceMats, texVerts));
//Maxscript.Command("{0} = getNodeByName \"{0}\"", mainObject);
Maxscript.Command("dummy name:\"Dummy_hotspot\" pos:{0} boxsize:[10,10,0]", Maxscript.Point3Literal(-mesh.Header.HotspotPosition.X, -mesh.Header.HotspotPosition.Z, mesh.Header.HotspotPosition.Y));
Maxscript.CommentTitle("TVert Hack"); // Needed <= 3ds Max 2014; idk about 2015+
Maxscript.Command("buildTVFaces {0}", mainObject);
for (int i = 1; i <= mesh.Faces.Count; i++)
{
Maxscript.Command("setTVFace {0} {1} {2}[{1}]", mainObject, i, faceArray);
}
Maxscript.CommentTitle("Load Normals for first Frame");
Maxscript.Command("max modify mode");
Maxscript.Command("select {0}", mainObject);
Maxscript.Command("addModifier {0} (Edit_Normals()) ui:off", mainObject);
Maxscript.Command("modPanel.setCurrentObject {0}.modifiers[#edit_normals]", mainObject);
Maxscript.Command("{0}.modifiers[#edit_normals].Break selection:#{{1..{1}}}", mainObject, mesh.Normals.Count);
Maxscript.Command("meshSetNormalIdFunc = {0}.modifiers[#edit_normals].SetNormalID", mainObject);
for (int i = 0; i < mesh.Faces.Count; ++i)
{
Maxscript.Command("meshSetNormalIdFunc {0} {1} {2}",
i + 1, 1, mesh.Faces[i].Indices[0] + 1);
Maxscript.Command("meshSetNormalIdFunc {0} {1} {2}",
i + 1, 2, mesh.Faces[i].Indices[2] + 1);
Maxscript.Command("meshSetNormalIdFunc {0} {1} {2}",
i + 1, 3, mesh.Faces[i].Indices[1] + 1);
}
Maxscript.Command("{0}.modifiers[#edit_normals].MakeExplicit selection:#{{1..{1}}}", mainObject, mesh.Normals.Count);
Maxscript.Command("meshSetNormalFunc = {0}.modifiers[#edit_normals].SetNormal", mainObject);
for (int i = 0; i < mesh.Normals.Count; i++)
{
Maxscript.Command("meshSetNormalFunc {0} {1}", i + 1,
Maxscript.Point3Literal(-mesh.Normals[i].X, -mesh.Normals[i].Z, mesh.Normals[i].Y));
}
Maxscript.Command("collapseStack {0}", mainObject);
if (mesh.Header.Flags.HasFlag(BrgMeshFlag.ANIMTEXCOORDS))
{
Maxscript.Command("select {0}", mainObject);
Maxscript.Command("addModifier {0} (Unwrap_UVW()) ui:off", mainObject);
Maxscript.Command("select {0}.verts", mainObject);
Maxscript.Animate("{0}.Unwrap_UVW.moveSelected [0,0,0]", mainObject);
}
}
Maxscript.CommentTitle("Load Attachpoints");
string attachDummyArray = "attachDummyArray";
if (!mesh.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH))
{
Maxscript.NewArray(attachDummyArray);
}
for (int i = 0; i < mesh.Attachpoints.Count; ++i)
{
BrgAttachpoint att = mesh.Attachpoints[i];
if (mesh.Header.Flags.HasFlag(BrgMeshFlag.SECONDARYMESH))
{
Maxscript.Command("attachpoint = {0}[{1}]", attachDummyArray, i + 1);
Maxscript.AnimateAtTime(time, "attachpoint.rotation = {0}", att.GetMaxTransform());
Maxscript.AnimateAtTime(time, "attachpoint.position = {0}", att.GetMaxPosition());
if (this.uniformAttachpointScale)
{
Maxscript.AnimateAtTime(time, "attachpoint.scale = [1,1,1]");
}
else
{
Maxscript.AnimateAtTime(time, "attachpoint.scale = {0}", att.GetMaxScale());
}
}
else
{
string attachDummy;
if (this.uniformAttachpointScale)
{
attachDummy = Maxscript.NewDummy("attachDummy", att.GetMaxName(), att.GetMaxTransform(), att.GetMaxPosition(), "[0.25,0.25,0.25]", "[1,1,1]");
}
else
{
attachDummy = Maxscript.NewDummy("attachDummy", att.GetMaxName(), att.GetMaxTransform(), att.GetMaxPosition(), att.GetMaxBoxSize(), att.GetMaxScale());
}
Maxscript.Command("append {0} {1}", attachDummyArray, attachDummy);
}
}
}