public Rbfx_RandomBoxes(Node RootNode) { var boxesNode = RootNode.CreateChild("Boxes"); boxesNode.SetTemporary(true); const int numObjects = 2000; var boxModel = RootNode.Context.Cache.GetResource <Urho3DNet.Model>("Models/Box.mdl"); //var boxMaterial = RootNode.Context.Cache.GetResource<Material>("Materials/Stone.xml"); var boxMaterial = Material_Ext.TransParentMaterial(new Color(1, 0, 0, .5f)); for (var i = 0; i < numObjects; ++i) { Node boxNode = new Node(RootNode.Context); boxNode.Name = "Box" + i.ToString("00"); boxesNode.AddChild(boxNode, 0); boxNode.Position = new Vector3(Shared_Utility.Randoms.Next(0, 200f) - 100f, Shared_Utility.Randoms.Next(0, 200f) - 100f, Shared_Utility.Randoms.Next(0, 200f) - 100f); //Orient using random pitch, yaw and roll Euler angles boxNode.Rotation = new Quaternion(Shared_Utility.Randoms.Next(0, 360.0f), Shared_Utility.Randoms.Next(0, 360.0f), Shared_Utility.Randoms.Next(0, 360.0f)); var boxObject = boxNode.CreateComponent <StaticModel>(); boxObject.SetModel(boxModel); boxObject.SetMaterial(boxMaterial); boxObject.CastShadows = true; boxNode.CreateComponent <RotateObject>(); var basenode = boxNode.CreateComponent <CustomNodeComponent>(); basenode.OriginalPosition = new Vector3(5, 10, 5); basenode.OriginalMaterial = boxMaterial; } }
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"); } }