Пример #1
0
        private int TangentStart()
        {
            Logger.Log("Getting TangentStart");
            var f = Engine_Faces[0];

            return(f.EngTriangles[0].V1.EngTexture == null ? 6 : 8);
        }
Пример #2
0
        public void GenerateNormals()
        {
            Logger.Log("Generating Normals");

            foreach (var engFace in Engine_Faces)
            {
                foreach (var triangle in engFace.EngTriangles)
                {
                    var trianglesCount = engFace.EngTriangles.Count();
                    triangle.GenerateNormal();
                }
            }
        }
Пример #3
0
        internal bool GenerateTangents()
        {
            Logger.Log("Generating Tangents");
            UseLargeIndex = true;
            var vbPoints        = GetVbArray();
            var IndexData       = GetLongIndexData();
            var tangentPosition = TangentStart();
            var vbSize          = GetVBSize();

            if (IndexData == null)
            {
                Logger.Log($"Maximum Limits Reached for this Model {Name}");
                return(false);
            }

            Urho3D.GenerateTangents(vbPoints, vbSize, IndexData, IndexSize(), 0, IndexData.Length, tangentPosition);

            var ps         = vbPoints.ToList();
            var facescount = Engine_Faces.Count;
            var pointSize  = Engine_Faces[0].EngTriangles[0].V1.GetSize();
            var triangles  = Engine_Faces.SelectMany(o => o.EngTriangles).ToList();

            foreach (var engTriangle in triangles)
            {
                var triIndex   = triangles.IndexOf(engTriangle);
                int rangestart = triIndex * 3 * pointSize;
                var range      = ps.GetRange(rangestart, 3 * pointSize);

                for (int rangeIndex = 0; rangeIndex < range.Count; rangeIndex++)
                {
                    var triPoints = engTriangle.GetPoints();
                    foreach (var engPoint in triPoints)
                    {
                        engPoint.EngTangent.X = range[tangentPosition];
                        engPoint.EngTangent.Y = range[tangentPosition + 1];
                        engPoint.EngTangent.Z = range[tangentPosition + 2];
                        engPoint.EngTangent.L = range[tangentPosition + 3];
                    }
                }
            }

            return(true);
        }
Пример #4
0
 private int IndexSize()
 {
     Logger.Log("Getting IndexSize");
     return(UseLargeIndex ? sizeof(int) : sizeof(short));
 }
Пример #5
0
 public int GetVBSize()
 {
     Logger.Log("Getting VBSize");
     return(Engine_Faces[0].GetEngPointSize() * sizeof(float));
 }
Пример #6
0
        public void CreateCustomShape2(Serializable.Engine_Geometry geom)
        {
            Logger.Log($"Generating Geometry [{geom.Name}]");

            if (geom.Engine_Faces.Count == 0)
            {
                Logger.Log($"Geometry: [{geom.Name}] has no faces", "", Logger.ErrorType.Warrning);
                return;
            }

            var geonode = RootNode.CreateChild(geom.Name);

            geonode.Scale(geom.Flip.ToVec3());
            if (geom.Rotation != null)
            {
                geonode.Rotate(new Quaternion(geom.Rotation.ToVec3()));
            }
            float scaleValue = (float)DynConstants.FeettoMeter;

            geonode.Scale(new Vector3(scaleValue, scaleValue, scaleValue));

            geom.GenerateNormals();
            if (!geom.GenerateTangents())
            {
                var failChild = geonode.CreateChild($"{geom.Name} Failed");
                failChild.Position = geom.Position.ToVec3();
                var model  = Cache.GetResource <Model>("Models/Box.mdl");
                var stcomp = failChild.CreateComponent <StaticModel>();
                stcomp.SetModel(model);
                return;
            }

            var    faceColorGroups = geom.Engine_Faces.GroupBy(o => o.FaceColor.ToString());
            string dir             = System.IO.Path.GetDirectoryName(geom.FileName);
            var    files           = System.IO.Directory.GetFiles(dir).ToList();

            foreach (var faceColorGroup in faceColorGroups)
            {
                var      facechild = geonode.CreateChild("Face_Color");
                Material mat       = null;

                var faceColor = faceColorGroup.ElementAt(0).FaceColor;

                if (faceColor.L != 1)
                {
                    mat = Material_Ext.TransParentMaterial(faceColor.ToColor());
                }
                else
                {
                    mat = Material_Ext.ColoredMaterial(faceColor.ToColor());
                }
                mat.CullMode = geom.GeoCullModel;
#if false
                var faceColor = faceColorGroup.ElementAt(0).FaceColor.ToColor();

                // mat = RootNode.Context.Cache.GetResource<Material>("Materials/Stone.xml");
                if (!files.Any(o => o.Contains(faceColor.ToString())))
                {
                    if (faceColor.ToVector4().W != 1)
                    {
                        mat = Material_Ext.TransParentMaterial(faceColor);
                    }
                    else
                    {
                        mat = Material_Ext.ColoredMaterial(faceColor);
                    }
                    mat.CullMode = geom.GeoCullModel;

                    var isSaved = mat.SaveFile(dir + "\\" + mat.Name);
                }

                mat = Cache.GetResource <Material>(dir + "\\" + faceColor.ToString() + ".xml");
#endif

                var cus = facechild.CreateComponent <CustomNodeComponent>();
                cus.OriginalMaterial = mat;

                var cusGeo = facechild.CreateComponent <CustomGeometry>();
                cusGeo.CastShadows = true;

                cusGeo.BeginGeometry(0, PrimitiveType.TriangleList);
                cusGeo.SetMaterial(mat);

                Logger.Log("Begin Geometry");
                foreach (var face in faceColorGroup)
                {
                    var triangles      = face.EngTriangles;
                    var trianglesCount = face.EngTriangles.Count;
                    for (int triIndex = 0; triIndex < trianglesCount; triIndex++)
                    {
                        var triangle  = triangles[triIndex];
                        var triPoints = triangle.GetPoints();
                        foreach (var engpoint in triPoints)
                        {
                            cusGeo.DefineVertex(engpoint.EngPosition.ToVec3());
                            cusGeo.DefineNormal(engpoint.EngNormal.ToVec3());
                            cusGeo.DefineTexCoord(engpoint.EngTexture.ToVec2());
                            cusGeo.DefineTangent(engpoint.EngTangent.ToVec4());
                        }
                    }
                }
                cusGeo.Commit();
                Logger.Log("End Geometry");
            }
        }