Esempio n. 1
0
        private void SetTransform(CSGGroup group, FBXNode node)
        {
            CSGVector position = new CSGVector();

            group.GetPosition(group.Parent, -1, ref position);

            position.Z *= -1;
            node.LclTranslationSet(new FBXVector(position.X, position.Y, position.Z));

            FBXVector eulerXYZRH = this.GetEulerXYZ(group, -1);

            node.LclRotationSet(new FBXVector(eulerXYZRH.x, eulerXYZRH.y, eulerXYZRH.z));
        }
Esempio n. 2
0
        private void CreateCMPData(FBXNode n)
        {
            Vector3 vOffset = Vector3.Zero;

            CmpndData cmpnd = new CmpndData();

            cmpnd.index       = 0;
            cmpnd.object_name = n.GetName();
            if (cmpnd.object_name == "Root")
            {
                cmpnd.name = "Root";
            }
            else
            {
                cmpnd.name = "Part_" + cmpnd.object_name;

                if (Relocate)
                {
                    vOffset = T(n.EvaluateLocalTranslation(FBXTime.Infinite(), ArcManagedFBX.Types.EPivotSet.eSourcePivot, false, false));
                }
            }

            cmpnd.object_data      = new ThreeDBData();
            cmpnd.object_data.data = new LodData[8];

            cmpnd.object_data.wireframe_lod = 0;

            int lods = 0;

            for (int i = 0; i < n.GetChildCount(); i++)
            {
                var cur_lodnode = n.GetChild(i);

                var match = Regex.Match(cur_lodnode.GetName(), @"^.+_lod(?<lod>[0-9])(?<wireframe>_vwd)?");
                if (match.Success)
                {
                    uint lod = uint.Parse(match.Groups["lod"].Value);
                    if (match.Groups["wireframe"].Success)
                    {
                        cmpnd.object_data.wireframe_lod = lod;
                    }

                    cmpnd.object_data.data[lod].meshes = new List <SMesh>();

                    lods++;

                    int numVerts = 0;
                    int numFaces = 0;

                    Vector3 bbmin = new Vector3(float.MaxValue);
                    Vector3 bbmax = new Vector3(float.MinValue);

                    for (int j = 0; j < cur_lodnode.GetChildCount(); j++)
                    {
                        var cur_node = cur_lodnode.GetChild(j);

                        var attr = cur_node.GetNodeAttribute();
                        if (attr == null)
                        {
                            continue;
                        }

                        if (attr.GetAttributeType() != ArcManagedFBX.Types.EAttributeType.eMesh)
                        {
                            continue;
                        }

                        var pmesh = attr as FBXMesh;

                        var cur_node_trans = T(cur_node.EvaluateGlobalTransform(FBXTime.Infinite(), ArcManagedFBX.Types.EPivotSet.eSourcePivot, false, false));
                        var cur_node_geo   = T(cur_node.GetGeometricMatrix(ArcManagedFBX.Types.EPivotSet.eSourcePivot));
                        cur_node_trans = cur_node_geo * cur_node_trans;

                        SMesh mesh = new SMesh();

                        int nTris = pmesh.GetPolygonCount();
                        if (nTris <= 0)
                        {
                            continue;
                        }

                        if (cur_node.GetMaterialCount() <= 0)
                        {
                            mesh.material_name = "default";
                        }
                        else
                        {
                            var material = cur_node.GetMaterial(0);
                            mesh.material_name = material.GetName();
                        }

                        mesh.name = cur_node.GetName();

                        mesh.t = new VMSTri[nTris];
                        int nVerts = nTris * 3;
                        mesh.v = new VMSVert[nVerts];

                        var vertices           = pmesh.GetControlPoints();
                        int tangentLayerCount  = pmesh.GetElementTangentCount();
                        var tangentLayer       = tangentLayerCount > 0 ? pmesh.GetElementTangent().GetDirectArray() : null;
                        int binormalLayerCount = pmesh.GetElementBinormalCount();
                        var binormalLayer      = binormalLayerCount > 0 ? pmesh.GetElementBinormal().GetDirectArray() : null;

                        for (int nTri = 0; nTri < nTris; nTri++)
                        {
                            mesh.t[nTri].vertices = new ushort[3];

                            for (int k = 0; k < 3; k++)
                            {
                                int nVert = (nTri * 3 + k);

                                Vector3   vertice, normal;
                                Vector2   uv;
                                bool      unmapped  = false;
                                FBXVector fbxuv     = new FBXVector();
                                FBXVector fbxnormal = new FBXVector();

                                vertice = Vector3.TransformCoordinate(T(vertices[pmesh.GetPolygonVertex(nTri, k)]), cur_node_trans);

                                // offset vertice
                                vertice -= vOffset;
                                pmesh.GetPolygonVertexUV(nTri, k, "map1", ref fbxuv, ref unmapped);
                                uv = T2(fbxuv);
                                pmesh.GetPolygonVertexNormal(nTri, k, ref fbxnormal);
                                normal = Vector3.TransformNormal(T(fbxnormal), cur_node_trans);

                                mesh.t[nTri].vertices[k] = (ushort)nVert;

                                mesh.v[nVert].vert   = vertice;
                                mesh.v[nVert].normal = normal;
                                mesh.v[nVert].uv     = uv;

                                mesh.v[nVert].tangent = tangentLayer != null?T(tangentLayer.GetAt(nVert)) : Vector3.Zero;

                                mesh.v[nVert].binormal = binormalLayer != null?T(binormalLayer.GetAt(nVert)) : Vector3.Zero;

                                /*
                                 *
                                 * float alpha = 1.0f;
                                 * int iVCindex = mesh->pMesh->GetFaceVertex(pTriangle->meshFaceIndex, i);
                                 * if (iVCindex != -1)
                                 * {
                                 *  alpha = mesh->pMesh->GetAlphaVertex(pTriangle->alpha[i]);
                                 *  color = mesh->pMesh->GetColorVertex(pTriangle->color[i]);
                                 *  mesh->v[nVert].diffuse = (DWORD)(alpha * 255) << 24 | (DWORD)(color.x * 255) << 16 | (DWORD)(color.y * 255) << 8 | (DWORD)(color.z * 255);
                                 *  mesh->v[nVert].uv = uv;
                                 * }
                                 * else
                                 * {
                                 *  mesh->v[nVert].tangent = Point3(0, 0, 0);
                                 *  mesh->v[nVert].binormal = Point3(0, 0, 0);
                                 * }*/

                                bbmin = Vector3.Min(bbmin, vertice);
                                bbmax = Vector3.Max(bbmin, vertice);
                            }
                        }

                        mesh.nVerts = nVerts;
                        numVerts   += mesh.nVerts;

                        mesh.nTris = nTris;
                        numFaces  += mesh.nTris;

                        cmpnd.object_data.data[lod].meshes.Add(mesh);
                    }

                    cmpnd.object_data.data[lod].vmeshref = new VMeshRef();
                    cmpnd.object_data.data[lod].vmeshref.BoundingBoxMaxX = bbmax.X;
                    cmpnd.object_data.data[lod].vmeshref.BoundingBoxMaxY = bbmax.Y;
                    cmpnd.object_data.data[lod].vmeshref.BoundingBoxMaxZ = bbmax.Z;
                    cmpnd.object_data.data[lod].vmeshref.BoundingBoxMinX = bbmin.X;
                    cmpnd.object_data.data[lod].vmeshref.BoundingBoxMinY = bbmin.Y;
                    cmpnd.object_data.data[lod].vmeshref.BoundingBoxMinZ = bbmin.Z;
                    var vCenter = (bbmax + bbmin) / 2;
                    cmpnd.object_data.data[lod].vmeshref.CenterX = vCenter.X;
                    cmpnd.object_data.data[lod].vmeshref.CenterY = vCenter.Y;
                    cmpnd.object_data.data[lod].vmeshref.CenterZ = vCenter.Z;
                    cmpnd.object_data.data[lod].vmeshref.Radius  = (bbmax - vCenter).Length() * 1.25f;

                    cmpnd.object_data.data[lod].vmeshref.HeaderSize = 60;
                    cmpnd.object_data.data[lod].vmeshref.NumMeshes  = (ushort)cmpnd.object_data.data[lod].meshes.Count;
                    cmpnd.object_data.data[lod].vmeshref.NumVert    = (ushort)numVerts;
                    cmpnd.object_data.data[lod].vmeshref.NumIndex   = (ushort)(numFaces * 3);

                    if (numFaces * 3 > 0xFFFF)
                    {
                        throw new ArgumentException($"{cmpnd.object_name} references more than 65535 vertices. Split the group into smaller groups!");
                    }
                }
            }

            cmpnd.object_data.lods = (uint)lods;
            cmpnd.index            = cmpndData.Count;
            cmpndData.Add(cmpnd);

            if (cmpnd.object_name != "Root")
            {
                if (cmpnd.object_name.EndsWith("_rev"))
                {
                    CmpRevData.Part revdata = new CmpRevData.Part();
                    revdata.ParentName = "Root";
                    revdata.ChildName  = cmpnd.object_name;

                    revdata.OriginX = vOffset.X;
                    revdata.OriginY = vOffset.Y;
                    revdata.OriginZ = vOffset.Z;

                    var mat = n.EvaluateLocalTransform(FBXTime.Infinite(), ArcManagedFBX.Types.EPivotSet.eSourcePivot, false, false);
                    revdata.RotMatXX = (float)mat.mData[0].x;
                    revdata.RotMatXY = (float)mat.mData[1].x;
                    revdata.RotMatXZ = (float)mat.mData[2].x;
                    revdata.RotMatYX = (float)mat.mData[0].y;
                    revdata.RotMatYY = (float)mat.mData[1].y;
                    revdata.RotMatYZ = (float)mat.mData[2].y;
                    revdata.RotMatZX = (float)mat.mData[0].z;
                    revdata.RotMatZY = (float)mat.mData[1].z;
                    revdata.RotMatZZ = (float)mat.mData[2].z;

                    revdata.AxisRotX = (float)mat.mData[0].x;
                    revdata.AxisRotY = (float)mat.mData[1].x;
                    revdata.AxisRotZ = (float)mat.mData[2].x;
                    revdata.Max      = 1;

                    rev.Parts.Add(revdata);
                }
                else if (cmpnd.object_name.EndsWith("_pris"))
                {
                    CmpRevData.Part revdata = new CmpRevData.Part();
                    revdata.ParentName = "Root";
                    revdata.ChildName  = cmpnd.object_name;

                    revdata.OriginX = vOffset.X;
                    revdata.OriginY = vOffset.Y;
                    revdata.OriginZ = vOffset.Z;

                    revdata.RotMatXX = revdata.RotMatYY = revdata.RotMatZZ = 1;

                    revdata.AxisRotZ = 1;
                    revdata.Max      = 360;

                    pris.Parts.Add(revdata);
                }
                else
                {
                    CmpFixData.Part fixdata = new CmpFixData.Part();
                    fixdata.ParentName = "Root";
                    fixdata.ChildName  = cmpnd.object_name;

                    fixdata.OriginX = vOffset.X;
                    fixdata.OriginY = vOffset.Y;
                    fixdata.OriginZ = vOffset.Z;

                    fixdata.RotMatXX = fixdata.RotMatYY = fixdata.RotMatZZ = 1;

                    fix.Parts.Add(fixdata);
                }
            }
        }
Esempio n. 3
0
 private Vector4 T4(FBXVector v)
 {
     return(new Vector4((float)v.x, (float)v.y, (float)v.z, (float)v.w));
 }
Esempio n. 4
0
 private Vector2 T2(FBXVector v)
 {
     return(new Vector2((float)v.x, (float)v.y));
 }
Esempio n. 5
0
 private Vector3 T(FBXVector v)
 {
     return(new Vector3((float)v.x, (float)v.y, (float)v.z));
 }
Esempio n. 6
0
        private void ExportGroupAnimation(CSGGroup group, FBXAnimLayer animationLayer, float keyFramesPerSecond, FBXNode node)
        {
            CSGAnimationKey[] animationKeyList = null;
            int keyListCount = 0;

            group.GetAnimationKeys(0, 999999, ref animationKeyList, ref keyListCount);
            int translationAnimationKeyCount = 0;
            int rotationAnimationKeyCount    = 0;

            foreach (var animationKey in animationKeyList)
            {
                if (animationKey.Type == CSGAnimationKeyType.CSGAnimationPositionKey)
                {
                    translationAnimationKeyCount++;
                }

                if (animationKey.Type == CSGAnimationKeyType.CSGAnimationOrientationKey)
                {
                    rotationAnimationKeyCount++;
                }
            }

            if (translationAnimationKeyCount > 1)
            {
                FBXAnimCurveNode myTranslationAnimCurveNode = node.LclTranslationGetCurveNode(animationLayer);

                FBXAnimCurve myTranXCurve = node.LclTranslationGetCurve(animationLayer, "X");
                FBXAnimCurve myTranYCurve = node.LclTranslationGetCurve(animationLayer, "Y");
                FBXAnimCurve myTranZCurve = node.LclTranslationGetCurve(animationLayer, "Z");

                myTranXCurve.KeyModifyBegin();
                myTranYCurve.KeyModifyBegin();
                myTranZCurve.KeyModifyBegin();

                foreach (var animationKey in animationKeyList)
                {
                    if (animationKey.Type == CSGAnimationKeyType.CSGAnimationPositionKey)
                    {
                        myTranXCurve.KeyAddSet(animationKey.Time / keyFramesPerSecond, animationKey.V.X);  // , ArcManagedFBX.Types.EInterpolationType.eInterpolationConstant);
                        myTranYCurve.KeyAddSet(animationKey.Time / keyFramesPerSecond, animationKey.V.Y);  // , ArcManagedFBX.Types.EInterpolationType.eInterpolationConstant);
                        myTranZCurve.KeyAddSet(animationKey.Time / keyFramesPerSecond, -animationKey.V.Z); // , ArcManagedFBX.Types.EInterpolationType.eInterpolationConstant);
                    }
                }

                myTranXCurve.KeyModifyEnd();
                myTranYCurve.KeyModifyEnd();
                myTranZCurve.KeyModifyEnd();
            }

            if (rotationAnimationKeyCount > 1)
            {
                FBXAnimCurveNode myRotationAnimCurveNode = node.LclRotationGetCurveNode(animationLayer);

                FBXAnimCurve myRotXCurve = node.LclRotationGetCurve(animationLayer, "X");
                FBXAnimCurve myRotYCurve = node.LclRotationGetCurve(animationLayer, "Y");
                FBXAnimCurve myRotZCurve = node.LclRotationGetCurve(animationLayer, "Z");

                myRotXCurve.KeyModifyBegin();
                myRotYCurve.KeyModifyBegin();
                myRotZCurve.KeyModifyBegin();

                foreach (var animationKey in animationKeyList)
                {
                    if (animationKey.Type == CSGAnimationKeyType.CSGAnimationOrientationKey)
                    {
                        FBXVector eulerXYZ = this.GetEulerXYZ(group, animationKey.Time);

                        myRotXCurve.KeyAddSet(animationKey.Time / keyFramesPerSecond, (float)eulerXYZ.x); // , ArcManagedFBX.Types.EInterpolationType.eInterpolationLinear);
                        myRotYCurve.KeyAddSet(animationKey.Time / keyFramesPerSecond, (float)eulerXYZ.y); // , ArcManagedFBX.Types.EInterpolationType.eInterpolationLinear);
                        myRotZCurve.KeyAddSet(animationKey.Time / keyFramesPerSecond, (float)eulerXYZ.z); // , ArcManagedFBX.Types.EInterpolationType.eInterpolationLinear);
                    }
                }

                myRotXCurve.KeyModifyEnd();
                myRotYCurve.KeyModifyEnd();
                myRotZCurve.KeyModifyEnd();
            }
        }
Esempio n. 7
0
        private void ExportShape(FBXScene fbxScene, FBXNode parentNode, CSGShape shape)
        {
            if (shape.RepresentativeEntityType == CSGEntityType.CSGEShape && shape.ShapeType == CSGShapeType.CSGShapeStandard && shape.GetFaceCount() > 0)
            {
                Dictionary <long, int> fbxPointIdList = new Dictionary <long, int>();
                List <CSGVectorLong>   fbxPointList   = new List <CSGVectorLong>();

                CSGVector[]           pointList                  = null;
                int                   pointListCount             = 0;
                CSGVector[]           normalList                 = null;
                int                   normalListCount            = 0;
                CSGUV[]               textureCoordinateList      = null;
                int                   textureCoordinateListCount = 0;
                CSGMaterialFaceList[] materialFaceList           = null;
                int                   materialFaceListCount      = 0;
                shape.GetGeometryMaterialSorted(
                    true,
                    false,
                    true,
                    ref pointList,
                    ref pointListCount,
                    ref normalList,
                    ref normalListCount,
                    ref textureCoordinateList,
                    ref textureCoordinateListCount,
                    ref materialFaceList,
                    ref materialFaceListCount);

                foreach (var material in materialFaceList)
                {
                    this.ExportMaterial(fbxScene, parentNode, material.Material);
                    foreach (var face in material.FaceList)
                    {
                        foreach (var facePoint in face.PointList)
                        {
                            long          fbxPointKey = facePoint.PointID << 42 | facePoint.NormalID << 21 | facePoint.TextureCoordinateListID[0];
                            CSGVectorLong fbxPoint;
                            if (fbxPointIdList.TryGetValue(fbxPointKey, out int fbxPointId))
                            {
                                fbxPoint = fbxPointList[fbxPointId];
                            }
                            else
                            {
                                fbxPoint = new CSGVectorLong()
                                {
                                    X = facePoint.PointID, Y = facePoint.NormalID, Z = facePoint.TextureCoordinateListID[0]
                                };
                                fbxPointId = fbxPointList.Count;

                                fbxPointList.Add(fbxPoint);

                                fbxPointIdList.Add(fbxPointKey, fbxPointId);
                            }
                        }
                    }
                }

                string shapeName = this.GetUniqueName(shape.Name, "shape");

                FBXMesh fbxMesh = FBXMesh.Create(fbxScene, shapeName);
                parentNode.AddNodeAttribute(fbxMesh);

                fbxMesh.InitControlPoints(fbxPointIdList.Count);
                fbxMesh.InitMaterialIndices(ArcManagedFBX.Types.EMappingMode.eByPolygon);
                fbxMesh.InitNormals(fbxPointIdList.Count);
                fbxMesh.InitTextureUV(0);
                fbxMesh.InitTextureUVIndices(ArcManagedFBX.Types.EMappingMode.eByControlPoint);

                int id = 0;
                foreach (var point in fbxPointList)
                {
                    FBXVector controlPoint = new FBXVector(pointList[point.X].X, pointList[point.X].Y, -pointList[point.X].Z);
                    fbxMesh.SetControlPointAt(controlPoint, id);

                    FBXVector normal = new FBXVector(normalList[point.Y].X, normalList[point.Y].Y, -normalList[point.Y].Z);
                    fbxMesh.SetControlPointNormalAt(normal, id);

                    ConvertTextureCoordinate(textureCoordinateList, point);

                    fbxMesh.AddTextureUV(new FBXVector2(textureCoordinateList[point.Z].U, textureCoordinateList[point.Z].V));

                    id++;
                }

                int materialId = 0;
                foreach (var material in materialFaceList)
                {
                    foreach (var face in material.FaceList)
                    {
                        fbxMesh.BeginPolygon(materialId, -1, -1, true);
                        foreach (var facePoint in face.PointList.Reverse())
                        {
                            long fbxPointKey = facePoint.PointID << 42 | facePoint.NormalID << 21 | facePoint.TextureCoordinateListID[0];
                            if (fbxPointIdList.TryGetValue(fbxPointKey, out int fbxPointId))
                            {
                                fbxMesh.AddPolygon(fbxPointId, fbxPointId);
                            }
                            else
                            {
                                // should never happen
                                Debug.WriteLine("what to do for the impossible?");
                                fbxMesh.AddPolygon(0, 0);
                            }
                        }

                        fbxMesh.EndPolygon();
                    }

                    materialId++;
                }
            }
        }