Пример #1
0
        public BigTerrainScene()
        {
            var whiteboxInfo = Object3dManager.LoadFromObjSingle(Media.Get("whiteroom.obj"));
            var whitebox     = Mesh3d.Create(new Object3dInfo(whiteboxInfo.Vertices), new GenericMaterial(new Vector3(1000, 1000, 1000)));

            whitebox.GetInstance(0).Scale(3000);
            whitebox.GetInstance(0).Translate(0, -1500, 0);
            Game.World.Scene.Add(whitebox);
        }
Пример #2
0
 public void Apply(Mesh3d mesh, float time, float speed = 1.0f)
 {
     var framedata = GetCurrentKeyFrame(time, speed);
     if(framedata == null)
         return;
     foreach(var o in framedata.Frame.Orientations)
     {
         var orient = Quaternion.Slerp(framedata.PreviousFrame.Orientations[o.Key], o.Value, framedata.Step);
         mesh.Bones.Find((a) => a.Name == o.Key).Orientation = orient;
     }
 }
Пример #3
0
        private void ApplyVboIbo(Mesh3d mesh, string vbo)
        {
            if (vbo.Length == 0)
            {
                return;
            }
            var obj = Object3dManager.LoadFromRaw(Media.Get(vbo));

            mesh.GetLodLevel(0).Info3d              = new Object3dInfo(obj.Vertices);
            mesh.GetLodLevel(0).Info3d.Manager      = obj;
            mesh.GetLodLevel(0).Info3d.Manager.Name = vbo;
        }
Пример #4
0
        Mesh3d CreateModel(Object3dInfo obj, Vector3 diffuse, Vector3 specular, float roughness)
        {
            var terrain3dInfo   = obj;
            var terrainMaterial = new GenericMaterial();

            terrainMaterial.DiffuseColor  = diffuse;
            terrainMaterial.SpecularColor = specular;
            terrainMaterial.Roughness     = roughness;
            var terrainMesh = Mesh3d.Create(terrain3dInfo, terrainMaterial);

            return(terrainMesh);
        }
Пример #5
0
        Mesh3d CreateDiffuseModelFromRaw(string obj, Vector3 color)
        {
            var terrain3dManager = Object3dManager.LoadFromRaw(Media.Get(obj));
            var terrain3dInfo    = new Object3dInfo(terrain3dManager.Vertices);
            var terrainMaterial  = new GenericMaterial();

            terrainMaterial.DiffuseColor  = new Vector3(0);
            terrainMaterial.SpecularColor = new Vector3(1);
            terrainMaterial.Roughness     = 0.5f;
            var terrainMesh = Mesh3d.Create(terrain3dInfo, terrainMaterial);

            return(terrainMesh);
        }
Пример #6
0
        Mesh3d CreateWall(Vector2 start, Vector2 end, Quaternion rotation, Vector3 position, Vector3 color)
        {
            var terrain3dManager = Object3dGenerator.CreateGround(start, end, new Vector2(1), Vector3.UnitY);
            var terrain3dInfo    = new Object3dInfo(terrain3dManager.Vertices);
            var terrainMaterial  = new GenericMaterial();

            terrainMaterial.DiffuseColor  = color;
            terrainMaterial.SpecularColor = Vector3.Zero;
            terrainMaterial.Roughness     = 0f;
            var terrainMesh = Mesh3d.Create(terrain3dInfo, terrainMaterial);

            terrainMesh.GetInstance(0).Rotate(rotation);
            return(terrainMesh);
        }
    public void SetContent(Mesh3d mesh)
    {
        m_mesh3d = mesh;

        Vector3L[] vertices = mesh.GetVertices();
        Vector3L   min      = vertices[0];
        Vector3L   max      = vertices[0];

        for (int i = 1; i < mesh.m_triangleList.Count * 3; ++i)
        {
            min.x = FixPointMath.Min(vertices[i].x, min.x);
            min.y = FixPointMath.Min(vertices[i].y, min.y);
            min.z = FixPointMath.Min(vertices[i].z, min.z);

            max.x = FixPointMath.Max(vertices[i].x, max.x);
            max.y = FixPointMath.Max(vertices[i].y, max.y);
            max.z = FixPointMath.Max(vertices[i].z, max.z);
        }
        m_aabb = Mesh3d.FromMinMax(min, max);
    }
    public static void AccelerateMesh(Mesh3d mesh)
    {
        if (mesh.m_accelerator != null)
        {
            return;
        }

        Vector3L[] vertices = mesh.GetVertices();
        Vector3L   min      = vertices[0];
        Vector3L   max      = vertices[0];

        for (int i = 1; i < mesh.m_triangleList.Count * 3; ++i)
        {
            min.x = FixPointMath.Min(vertices[i].x, min.x);
            min.y = FixPointMath.Min(vertices[i].y, min.y);
            min.z = FixPointMath.Min(vertices[i].z, min.z);

            max.x = FixPointMath.Max(vertices[i].x, max.x);
            max.y = FixPointMath.Max(vertices[i].y, max.y);
            max.z = FixPointMath.Max(vertices[i].z, max.z);
        }

        mesh.m_accelerator            = new BVHNode();
        mesh.m_accelerator.m_bounds   = FromMinMax(min, max);
        mesh.m_accelerator.m_children = null;
//         this.m_accelerator.m_triangles = this.m_triangleList.Count;
//         this.m_accelerator->triangles = new int[mesh.numTriangles];
//      for (int i = 0; i < mesh.numTriangles; ++i) {
//          mesh.accelerator->triangles[i] = i;
//      }
        //this.m_accelerator.m_triangles = this.m_triangleList;
//         for (int i = 0; i < mesh.m_triangleList.Count; ++i)
//         {
//             mesh.m_accelerator.m_triangles.Add(mesh.m_triangleList);
//         }
        mesh.m_accelerator.m_triangles.AddRange(mesh.m_triangleList);

        SplitBVHNode(mesh.m_accelerator, mesh, 3);
    }
Пример #9
0
    bool Accelerate(Vector3L position, FloatL size)
    {
        if (m_octree != null)
        {
            return(false);
        }

        Vector3L min = new Vector3L(position.x - size, position.y - size, position.z - size);
        Vector3L max = new Vector3L(position.x + size, position.y + size, position.z + size);

        // Construct tree root
        m_octree            = new OctreeNode();
        m_octree.m_bounds   = Mesh3d.FromMinMax(min, max);
        m_octree.m_children = null;
        for (int i = 0, size2 = m_modleList.Count; i < size2; ++i)
        {
            m_octree.m_models.Add(m_modleList[i]);
        }

        // Create tree
        Octree3d.SplitTree(m_octree, 5);
        return(true);
    }
Пример #10
0
 private void ApplyVboIbo(Mesh3d mesh, string vbo)
 {
     if(vbo.Length == 0)
         return;
     var obj = Object3dManager.LoadFromRaw(Media.Get(vbo));
     mesh.GetLodLevel(0).Info3d = new Object3dInfo(obj.Vertices);
     mesh.GetLodLevel(0).Info3d.Manager = obj;
 }
Пример #11
0
        private void LoadFromString(string[] lines)
        {
            Materials = new List <GenericMaterial>();
            Meshes    = new List <Mesh3d>();
            Lights    = new List <Light>();
            Cameras   = new List <Camera>();
            var             regx            = new Regex("(.+?)[ ]+(.+)");
            var             currentMaterial = new GenericMaterial(Vector3.One);
            Light           tempLight       = null;
            GenericMaterial tempMaterial    = null;
            Mesh3d          tempMesh        = null;
            Camera          tempCamera      = null;
            Action          flush           = () =>
            {
                if (tempLight != null)
                {
                    Lights.Add(tempLight);
                    if (OnObjectFinish != null)
                    {
                        OnObjectFinish.Invoke(this, tempLight);
                    }
                }
                if (tempMaterial != null)
                {
                    Materials.Add(tempMaterial);
                    if (OnObjectFinish != null)
                    {
                        OnObjectFinish.Invoke(this, tempMaterial);
                    }
                }
                if (tempMesh != null)
                {
                    Meshes.Add(tempMesh);
                    if (OnObjectFinish != null)
                    {
                        OnObjectFinish.Invoke(this, tempMesh);
                    }
                }
                if (tempCamera != null)
                {
                    Cameras.Add(tempCamera);
                    if (OnObjectFinish != null)
                    {
                        OnObjectFinish.Invoke(this, tempCamera);
                    }
                }

                tempLight    = null;
                tempMaterial = null;
                tempMesh     = null;
                tempCamera   = null;
            };
            string       vertexbuffer = "";
            PhysicalBody physob       = null;

            foreach (var l in lines)
            {
                if (l.StartsWith("//") || l.Trim().Length == 0)
                {
                    continue;
                }
                var regout = regx.Match(l);
                if (!regout.Success)
                {
                    throw new ArgumentException("Invalid line in scene string: " + l);
                }
                string command = regout.Groups[1].Value.Trim();
                string data    = regout.Groups[2].Value.Trim();
                if (command.Length == 0 || data.Length == 0)
                {
                    throw new ArgumentException("Invalid line in scene string: " + l);
                }

                switch (command)
                {
                // Mesh3d start
                case "mesh":
                {
                    flush();
                    tempMesh = Mesh3d.Empty;
                    tempMesh.AddInstance(new Mesh3dInstance(new TransformationManager(Vector3.Zero), data));
                    //tempMesh.Name = data;
                    break;
                }

                case "usematerial":
                {
                    tempMesh.AddLodLevel(null, Materials.First((a) => a.Name == data), 0, 999999);
                    break;
                }

                case "scaleuv":
                {
                    string[] literals = data.Split(' ');
                    float    x, y;
                    if (!float.TryParse(literals[0], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out x))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    if (!float.TryParse(literals[1], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out y))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    tempMesh.GetLodLevel(0).Info3d.Manager.ScaleUV(x, y);
                    var obj = tempMesh.GetLodLevel(0).Info3d.Manager;
                    tempMesh.GetLodLevel(0).SetInfo3d(new Object3dInfo(tempMesh.GetLodLevel(0).Info3d.Manager.Vertices));
                    tempMesh.GetLodLevel(0).Info3d.Manager = obj;
                    break;
                }

                case "vbo":
                {
                    vertexbuffer = data;
                    ApplyVboIbo(tempMesh, vertexbuffer);
                    vertexbuffer = "";
                    break;
                }

                case "physics":
                {
                    var datas = data.Split(' ');
                    if (datas[0] == "convexhull")
                    {
                        if (tempMesh == null)
                        {
                            throw new ArgumentException("Invalid line in scene string: " + l);
                        }
                        var   shape = tempMesh.GetLodLevel(0).Info3d.Manager.GetConvexHull();
                        float mass;
                        if (!float.TryParse(datas[1], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out mass))
                        {
                            throw new ArgumentException("Invalid line in scene string: " + l);
                        }
                        physob = Game.World.Physics.CreateBody(mass, tempMesh.GetInstance(0), shape);
                    }
                    if (datas[0] == "boundingbox")
                    {
                        if (tempMesh == null)
                        {
                            throw new ArgumentException("Invalid line in scene string: " + l);
                        }
                        var   shape = Physics.CreateBoundingBoxShape(tempMesh.GetLodLevel(0).Info3d.Manager);
                        float mass;
                        if (!float.TryParse(datas[1], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out mass))
                        {
                            throw new ArgumentException("Invalid line in scene string: " + l);
                        }
                        physob = Game.World.Physics.CreateBody(mass, tempMesh.GetInstance(0), shape);
                    }
                    if (datas[0] == "accurate")
                    {
                        if (tempMesh == null)
                        {
                            throw new ArgumentException("Invalid line in scene string: " + l);
                        }
                        var   shape = tempMesh.GetLodLevel(0).Info3d.Manager.GetAccurateCollisionShape();
                        float mass;
                        if (!float.TryParse(datas[1], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out mass))
                        {
                            throw new ArgumentException("Invalid line in scene string: " + l);
                        }
                        physob = Game.World.Physics.CreateBody(mass, tempMesh.GetInstance(0), shape);
                    }
                    if (datas[0] == "enable")
                    {
                        if (physob == null)
                        {
                            throw new ArgumentException("Invalid line in scene string: " + l);
                        }
                        physob.Enable();
                    }
                    break;
                }

                case "translate":
                {
                    string[] literals = data.Split(' ');
                    if (literals.Length != 3)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    float x, y, z;
                    if (!float.TryParse(literals[0], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out x))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    if (!float.TryParse(literals[1], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out y))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    if (!float.TryParse(literals[2], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out z))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    if (tempMesh != null)
                    {
                        tempMesh.GetInstance(0).Transformation.Translate(x, y, z);
                    }
                    if (tempCamera != null)
                    {
                        tempCamera.Transformation.Translate(x, y, z);
                    }
                    if (tempLight != null)
                    {
                        tempLight.Transformation.Translate(x, y, z);
                    }
                    break;
                }

                case "scale":
                {
                    if (tempMesh == null)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    string[] literals = data.Split(' ');
                    if (literals.Length != 3)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    float x, y, z;
                    if (!float.TryParse(literals[0], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out x))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    if (!float.TryParse(literals[1], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out y))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    if (!float.TryParse(literals[2], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out z))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    tempMesh.GetInstance(0).Transformation.Scale(x, y, z);
                    break;
                }

                case "rotate":
                {
                    string[] literals = data.Split(' ');
                    if (literals.Length < 3 || literals.Length > 4)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    float x, y, z;
                    if (!float.TryParse(literals[0], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out x))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    if (!float.TryParse(literals[1], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out y))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    if (!float.TryParse(literals[2], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out z))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    Quaternion rot = Quaternion.Identity;
                    if (literals.Length == 3)
                    {
                        var rotx = Matrix3.CreateRotationX(MathHelper.DegreesToRadians(x));
                        var roty = Matrix3.CreateRotationY(MathHelper.DegreesToRadians(y));
                        var rotz = Matrix3.CreateRotationZ(MathHelper.DegreesToRadians(z));
                        rot = Quaternion.FromMatrix(rotx * roty * rotz);
                    }
                    if (literals.Length == 4)
                    {
                        float w;
                        if (!float.TryParse(literals[3], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out w))
                        {
                            throw new ArgumentException("Invalid line in scene string: " + l);
                        }
                        rot = new Quaternion(x, y, z, w);
                    }

                    if (tempMesh != null)
                    {
                        tempMesh.GetInstance(0).Transformation.Rotate(rot);
                    }
                    if (tempCamera != null)
                    {
                        tempCamera.Transformation.Rotate(rot);
                    }
                    if (tempLight != null)
                    {
                        tempLight.Transformation.Rotate(rot);
                    }
                    break;
                }

                // Mesh3d end Material start
                case "material":
                {
                    flush();
                    tempMaterial      = new GenericMaterial(Vector3.One);
                    tempMaterial.Name = data;
                    break;
                }

                case "type":
                {
                    if (tempMaterial == null)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    tempMaterial.Type = (GenericMaterial.MaterialType)Enum.Parse(typeof(GenericMaterial.MaterialType), data, true);
                    break;
                }

                case "invertnormalmap":
                {
                    if (tempMaterial == null)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    // tempMaterial.InvertNormalMap = data == "true" ? true : false;
                    break;
                }

                case "transparency":
                {
                    if (tempMaterial == null)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    //tempMaterial.SupportTransparency = data == "true" ? true : false;
                    break;
                }

                case "normalmap":
                {
                    if (tempMaterial == null)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    tempMaterial.NormalsTexture = new Texture(Media.Get(data));
                    break;
                }

                case "bumpmap":
                {
                    if (tempMaterial == null)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    tempMaterial.BumpTexture = new Texture(Media.Get(data));
                    break;
                }

                case "roughnessmap":
                {
                    if (tempMaterial == null)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    tempMaterial.RoughnessTexture = new Texture(Media.Get(data));
                    break;
                }

                case "metalnessmap":
                {
                    if (tempMaterial == null)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    // tempMaterial.MetalnessMap = new Texture(Media.Get(data));
                    break;
                }

                case "roughness":
                {
                    if (tempMaterial == null)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    float f;
                    if (!float.TryParse(data, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out f))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    tempMaterial.Roughness = f;
                    break;
                }

                case "metalness":
                {
                    if (tempMaterial == null)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    float f;
                    if (!float.TryParse(data, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out f))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    //tempMaterial.Metalness = f;
                    break;
                }

                case "color":
                {
                    if (tempMaterial == null)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    string[] literals = data.Split(' ');
                    if (literals.Length != 3)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    float x, y, z;
                    if (!float.TryParse(literals[0], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out x))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    if (!float.TryParse(literals[1], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out y))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    if (!float.TryParse(literals[2], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out z))
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    tempMaterial.DiffuseColor = new Vector3(x, y, z);
                    break;
                }

                case "texture":
                {
                    if (tempMaterial == null)
                    {
                        throw new ArgumentException("Invalid line in scene string: " + l);
                    }
                    tempMaterial.DiffuseTexture  = new Texture(Media.Get(data));
                    tempMaterial.SpecularTexture = tempMaterial.DiffuseTexture;
                    //tempMaterial.Mode = GenericMaterial.DrawMode.TextureMultipleColor;
                    break;
                }

                // Material end
                default:
                    throw new ArgumentException("Invalid line in scene string: " + l);
                }
            }
            flush();
        }
Пример #12
0
        public static void Create()
        {
            var lucyobj = new Object3dInfo(Object3dManager.LoadFromObjSingle(Media.Get("sph1.obj")).Vertices);

            var bbmaterial = new GenericMaterial();

            bbmaterial.Roughness     = 0;
            bbmaterial.DiffuseColor  = Vector3.Zero;
            bbmaterial.SpecularColor = Vector3.One;

            var lucy = Mesh3d.Create(lucyobj, bbmaterial);

            lucy.ClearInstances();
            lucy.AutoRecalculateMatrixForOver16Instances = true;
            Game.World.Scene.Add(lucy);
            Commons.PickedMesh = lucy;
            Commons.Picked     = null;

            int      cnt = 0, din = 256;
            Renderer pp = new Renderer(din, din, 1);

            pp.GraphicsSettings.UseDeferred  = true;
            pp.GraphicsSettings.UseRSM       = false;
            pp.GraphicsSettings.UseVDAO      = true;
            pp.GraphicsSettings.UseFog       = false;
            pp.GraphicsSettings.UseBloom     = false;
            pp.GraphicsSettings.UseCubeMapGI = false;
            Game.DisplayAdapter.MainRenderer.CubeMaps.Clear();

            var internalMapping = new Dictionary <Renderer.CubeMapInfo, CubeMapFramebuffer>();

            /*
             * for(float x = -10; x < 13; x += 4.0f)
             * {
             *  for(float y = 0.2f; y < 15.3f; y += 6.0f)
             *  {
             *      for(float z = -3; z < 3.5; z += 3.0f)
             *      {
             *          CubeMapFramebuffer cubens = new CubeMapFramebuffer(din, din);
             *
             *          cubens.SetPosition(x*0.98f - 0.35f, y, z - 0.25f);
             *
             *          lucy.AddInstance(new Mesh3dInstance(new TransformationManager(cubens.GetPosition(), Quaternion.Identity, 0.1f), "cubemap-marker-" + cnt.ToString()));
             *          var info = new Renderer.CubeMapInfo()
             *          {
             *              FalloffScale = 5.0f,
             *              Texture = cubens.Texture,
             *              Position = cubens.GetPosition()
             *          };
             *          Game.DisplayAdapter.MainRenderer.CubeMaps.Add(info);
             *          internalMapping.Add(info, cubens);
             *          cnt++;
             *      }
             *  }
             * }*/

            for (int i = 0; i < 100; i++)
            {
                CubeMapFramebuffer cubens = new CubeMapFramebuffer(din, din);

                cubens.SetPosition(0, i, 0);

                lucy.AddInstance(new Mesh3dInstance(new TransformationManager(cubens.GetPosition(), Quaternion.Identity, 0.1f), "cubemap-marker-" + cnt.ToString()));
                var info = new Renderer.CubeMapInfo()
                {
                    FalloffScale = 7.0f,
                    Texture      = cubens.Texture,
                    Position     = cubens.GetPosition()
                };
                Game.DisplayAdapter.MainRenderer.CubeMaps.Add(info);
                internalMapping.Add(info, cubens);
                cnt++;
            }


            int  index    = 0;
            bool livemode = false;

            Game.OnKeyUp += (xa, eargs) =>
            {
                if (eargs.Key == OpenTK.Input.Key.PageUp)
                {
                    index++;
                }
                if (eargs.Key == OpenTK.Input.Key.PageDown)
                {
                    index--;
                }
                if (index > 9)
                {
                    index = 0;
                }
                if (index < 0)
                {
                    index = 9;
                }
                if (Commons.Picked == null)
                {
                    index = 0;
                }
                Commons.Picked      = lucy.GetInstance(index);
                TitleOutput.Message = "Picked cubemap ID " + index.ToString();
                if (eargs.Key == OpenTK.Input.Key.End)
                {
                    livemode = !livemode;
                }
                if (eargs.Key == OpenTK.Input.Key.Insert)
                {
                    for (int i = 0; i < cnt; i++)
                    {
                        Game.DisplayAdapter.MainRenderer.CubeMaps[i].Position *= -1;
                        internalMapping[Game.DisplayAdapter.MainRenderer.CubeMaps[i]].Clear();
                    }
                }
                if (eargs.Key == OpenTK.Input.Key.Home)
                {
                    var cpos = Camera.MainDisplayCamera.GetPosition();

                    /*
                     * float angle = 0;
                     * for(int i = 0; i < cnt; i++)
                     * {
                     *  float prc = (float)i / (float)cnt;
                     *  angle += 2.39996322f;
                     *  var disp = new Vector3(prc * 15.0f * (float)Math.Sin(angle), 1.0f - prc * 3.0f, prc * 15.0f * (float)Math.Cos(angle));
                     *  lucy.GetInstance(i).SetPosition(cpos + disp);
                     * }*/
                    for (int x = 0; x < 10; x++)
                    {
                        for (int y = 0; y < 10; y++)
                        {
                            int i = y + x * 10;
                            lucy.GetInstance(i).SetPosition(cpos + new Vector3(x - 5, 0, y - 5) * 2);
                        }
                    }
                }
                if (eargs.Key == OpenTK.Input.Key.Up)
                {
                    Game.DisplayAdapter.MainRenderer.CubeMaps[index].FalloffScale += 0.1f;
                }
                if (eargs.Key == OpenTK.Input.Key.Down)
                {
                    Game.DisplayAdapter.MainRenderer.CubeMaps[index].FalloffScale -= 0.1f;
                    if (Game.DisplayAdapter.MainRenderer.CubeMaps[index].FalloffScale < 0.02)
                    {
                        Game.DisplayAdapter.MainRenderer.CubeMaps[index].FalloffScale = 0.02f;
                    }
                }
            };
            int ix = 0;

            Game.OnBeforeDraw += (od, dsd) =>
            {
                //  for(int i = 0; i < 23; i++)
                // {
                //  if((lucy.GetInstance(i).GetPosition() - Game.DisplayAdapter.MainRenderer.CubeMaps[i].Position).Length > 0.01f)
                // {
                var cubes = Game.DisplayAdapter.MainRenderer.CubeMaps;
                if (!livemode)
                {
                    for (int iz = 0; iz < cnt; iz++)
                    {
                        if ((lucy.GetInstance(iz).GetPosition() - cubes[iz].Position).Length > 0.01f)
                        {
                            //internalMapping[cubes[iz]].Clear();
                        }
                    }
                    for (int iz = 0; iz < cnt; iz++)
                    {
                        if ((lucy.GetInstance(iz).GetPosition() - cubes[iz].Position).Length > 0.01f)
                        {
                            Game.World.CurrentlyRenderedCubeMap = iz;
                            pp.CubeMaps        = cubes;
                            cubes[iz].Position = lucy.GetInstance(iz).GetPosition();
                            internalMapping[cubes[iz]].SetPosition(lucy.GetInstance(iz).GetPosition());
                            pp.RenderToCubeMapFramebuffer(internalMapping[cubes[iz]]);
                            internalMapping[cubes[iz]].GenerateMipMaps();
                            Game.World.CurrentlyRenderedCubeMap = -1;
                        }
                    }

                    return;
                }
                int i = ix++;
                if (ix >= cnt)
                {
                    ix = 0;
                }
                Game.World.CurrentlyRenderedCubeMap = i;
                pp.CubeMaps       = cubes;
                cubes[i].Position = lucy.GetInstance(i).GetPosition();
                internalMapping[cubes[i]].SetPosition(lucy.GetInstance(i).GetPosition());
                pp.RenderToCubeMapFramebuffer(internalMapping[cubes[i]]);
                internalMapping[cubes[i]].GenerateMipMaps();
                Game.World.CurrentlyRenderedCubeMap = -1;
                //  }
                //  }
            };
        }
Пример #13
0
        private static NodeOut CreateNode(Vector3 origin, Quaternion rotation, float minNodesAngle, float maxNodesAngle, int maxNodesCountPerLevel, float scale, int iterations, float scaleDescendant, bool addLeaves, List<VEngine.Mesh3d.Bone> boneSystem = null, VEngine.Mesh3d.Bone boneParent = null)
        {
            List<Mesh3d> elements = new List<Mesh3d>();
            List<Mesh3d> leafs = new List<Mesh3d>();
            float nodeModelHeight = Node.GetAxisAlignedBox().Y * scale;
            var currentBone = new Mesh3d.Bone();
            if(boneSystem != null)
            {
                currentBone = new Mesh3d.Bone()
                {
                    Head = origin,
                    Tail = origin + Vector3.Transform(Vector3.UnitY * nodeModelHeight, rotation),
                    Name = boneParent.Name == "rootofroot" ? "root" : "bone" + boneSystem.Count.ToString(),
                    Orientation = Quaternion.Identity,
                    Parent = boneParent,
                    ParentName = boneParent.Name
                };
            }
            if(iterations > 1)
            {
                var root = new Mesh3d(Node, NodeMaterial);
                root.Translate(origin);
                root.Scale(scale);
                root.Rotate(rotation);
                elements.Add(root);
                if(boneSystem != null)
                {
                    boneSystem.Add(currentBone);
                }
            }

            Vector3 direction = rotation.ToDirection(Vector3.UnitY);
            Vector3 tgLeft = rotation.ToDirection(Vector3.UnitZ);
            if(iterations > 0)
            {
                for(int i = 0; i < maxNodesCountPerLevel; i++)
                {
                    var randomOrigin = origin + (direction * nodeModelHeight * (Rand() * 0.5f + 0.5f));

                    float sign1 = Rand() > 0.5f ? -1 : 1;
                    float angle = Mix(minNodesAngle, maxNodesAngle, Rand()) * sign1;
                    var rotLeft = Quaternion.FromAxisAngle(tgLeft, angle);
                    var rotForward = Quaternion.FromAxisAngle(direction, MathHelper.TwoPi * Rand());

                    var randomRotation = Quaternion.Multiply(rotForward, Quaternion.Multiply(rotLeft, rotation));
                    var single = CreateNode(randomOrigin, randomRotation, minNodesAngle, maxNodesAngle, maxNodesCountPerLevel, scale * (Rand() * 0.2f + scaleDescendant), iterations - 1, scaleDescendant, addLeaves, boneSystem, currentBone);
                    elements.AddRange(single.Nodes);
                    leafs.AddRange(single.Leafs);
                }
            }
            if(iterations < 2 && addLeaves)
            {
                for(int i = 0; i < 12; i++)
                {
                    var randomOrigin = origin + (direction * nodeModelHeight * (Rand()));
                    randomOrigin += (new Vector3(Rand(), Rand(), Rand()) - new Vector3(0.5f)) * 1.0f;

                    float sign1 = Rand() > 0.5f ? -1 : 1;
                    float angle = Mix(minNodesAngle, maxNodesAngle, Rand()) * sign1;
                    var rotLeft = Quaternion.FromAxisAngle(tgLeft, angle);
                    var rotForward = Quaternion.FromAxisAngle(direction, MathHelper.TwoPi * Rand());

                    var randomRotation = Quaternion.Multiply(rotForward, Quaternion.Multiply(rotLeft, rotation));
                    var leaf = new Mesh3d(Leaf, LeafMaterial);
                    leaf.Translate(randomOrigin);
                    leaf.Scale(Rand() * 1.5f + 0.4f);
                    leaf.Rotate(randomRotation);
                    leafs.Add(leaf);
                }
            }

            return new NodeOut()
            {
                Nodes = elements,
                Leafs = leafs
            };
        }
Пример #14
0
    static void SplitBVHNode(BVHNode node, Mesh3d model, int depth)
    {
        if (depth-- <= 0)       // Decrements depth
        {
            return;
        }

        if (node.m_children == null)
        {
            // Only split if this node contains triangles
            if (node.m_triangles.Count > 0)
            {
                node.m_children = new BVHNode[8];

                Vector3L c = node.m_bounds.m_pos;
                Vector3L e = node.m_bounds.GetHalfSize() * 0.5f;

                node.m_children[0].m_bounds = new AABB3d(c + new Vector3L(-e.x, +e.y, -e.z), node.m_bounds.GetHalfSize());
                node.m_children[1].m_bounds = new AABB3d(c + new Vector3L(+e.x, +e.y, -e.z), node.m_bounds.GetHalfSize());
                node.m_children[2].m_bounds = new AABB3d(c + new Vector3L(-e.x, +e.y, +e.z), node.m_bounds.GetHalfSize());
                node.m_children[3].m_bounds = new AABB3d(c + new Vector3L(+e.x, +e.y, +e.z), node.m_bounds.GetHalfSize());
                node.m_children[4].m_bounds = new AABB3d(c + new Vector3L(-e.x, -e.y, -e.z), node.m_bounds.GetHalfSize());
                node.m_children[5].m_bounds = new AABB3d(c + new Vector3L(+e.x, -e.y, -e.z), node.m_bounds.GetHalfSize());
                node.m_children[6].m_bounds = new AABB3d(c + new Vector3L(-e.x, -e.y, +e.z), node.m_bounds.GetHalfSize());
                node.m_children[7].m_bounds = new AABB3d(c + new Vector3L(+e.x, -e.y, +e.z), node.m_bounds.GetHalfSize());
            }
        }

        // If this node was just split
        if (node.m_children != null && node.m_triangles.Count > 0)
        {
            for (int i = 0; i < 8; ++i)
            { // For each child
                // Count how many triangles each child will contain
                //node.m_children[i].numTriangles = 0;
                for (int j = 0; j < node.m_triangles.Count; ++j)
                {
                    Triangle3d t = node.m_triangles[j];
                    if (IntersectionTest3D.Triangle3dWithAABB3d(t, node.m_children[i].m_bounds))
                    {
                        node.m_children[i].m_triangles.Add(t);
                    }
                }
//              if (node.children[i].numTriangles == 0) {
//                  continue;
//              }
//              node.children[i].triangles = new int[node.children[i].numTriangles];
//              int index = 0; // Add the triangles in the new child arrau
//              for (int j = 0; j < node.numTriangles; ++j)
//                 {
//                  Triangle t = model.triangles[node.triangles[j]];
//                  if (TriangleAABB(t, node.children[i].bounds)) {
//                      node.children[i].triangles[index++] = node.triangles[j];
//                  }
//              }
            }

            //node.numTriangles = 0;
            //delete[] node.triangles;
            node.m_triangles.Clear();

            // Recurse
            for (int i = 0; i < 8; ++i)
            {
                SplitBVHNode(node.m_children[i], model, depth);
            }
        }
    }
Пример #15
0
        public HotelScene()
        {
            var scene = Game.World.Scene;

            Game.Invoke(() =>
            {
                var unknownMaterial = new GenericMaterial(new Vector3(1));

                var lines = System.IO.File.ReadAllLines(Media.Get("scene.scn"));
                int linec = lines.Length;

                var texmap   = new Dictionary <string, TexInfo>();
                var matermap = new Dictionary <string, GenericMaterial>();

                var mat        = new GenericMaterial();
                var trans      = Matrix4.Identity;
                var glossyNtex = new Texture(Media.Get("200_norm.jpg"));
                var fussyNtex  = new Texture(Media.Get("174_norm.jpg"));

                for (int i = 0; i < linec; i++)
                {
                    var line = lines[i];
                    if (line.Contains("scene.textures.texture"))
                    {
                        var sdot       = line.Split('.');
                        string keyname = sdot[2];
                        if (!texmap.ContainsKey(keyname))
                        {
                            texmap.Add(keyname, new TexInfo());
                        }
                        if (line.Contains(keyname + ".gain"))
                        {
                            var vals = line.Split('=')[1];
                            vals.Trim();
                            texmap[keyname].Gain = StringToFloat(vals);
                        }
                        if (line.Contains(keyname + ".value"))
                        {
                            var vals = line.Split('=')[1].Trim().Split(' ');
                            if (vals.Length >= 3)
                            {
                                texmap[keyname].Value = new Vector3(StringToFloat(vals[0]), StringToFloat(vals[1]), StringToFloat(vals[2]));
                            }
                            else if (vals.Length == 1)
                            {
                                texmap[keyname].Value = new Vector3(StringToFloat(vals[0]));
                            }
                        }
                        if (line.Contains(keyname + ".uvscale"))
                        {
                            var vals = line.Split('=')[1].Trim().Split(' ');
                            if (vals.Length >= 2)
                            {
                                texmap[keyname].UVScale = new Vector2(StringToFloat(vals[0]), StringToFloat(vals[1]));
                            }
                            else if (vals.Length == 1)
                            {
                                texmap[keyname].UVScale = new Vector2(StringToFloat(vals[0]));
                            }
                        }
                        if (line.Contains(keyname + ".file"))
                        {
                            var vals = line.Split('=')[1].Trim(new char[] { ' ', '"' });
                            texmap[keyname].TexFile = vals.Replace(".exr", ".png");
                        }
                        if (line.Contains(keyname + ".type"))
                        {
                            var vals             = line.Split('=')[1].Trim(new char[] { ' ', '"' });
                            texmap[keyname].Type = vals;
                        }
                    }
                    else if (line.Contains("scene.materials.material"))
                    {
                        var sdot       = line.Split('.');
                        string keyname = sdot[2];
                        if (!matermap.ContainsKey(keyname))
                        {
                            matermap.Add(keyname, new GenericMaterial());
                        }
                        if (line.Contains(keyname + ".d ") || line.Contains(keyname + ".kd "))
                        {
                            var vals = line.Split('=')[1].Trim(new char[] { ' ', '"' });
                            if (texmap.ContainsKey(vals))
                            {
                                //matermap[keyname].
                                //matermap[keyname].if(texmap.ContainsKey(vals))
                                {
                                    if (texmap[vals].TexFile.Length > 1)
                                    {
                                        matermap[keyname].DiffuseTexture = new Texture(Media.Get(System.IO.Path.GetFileName(texmap[vals].TexFile)));
                                    }
                                    else
                                    {
                                        matermap[keyname].DiffuseColor = texmap[vals].Value;
                                    }
                                    // matermap[keyname].InvertUVYAxis = texmap[vals].InvertUVX || texmap[vals].InvertUVY;
                                }
                            }
                        }
                        if (line.Contains(keyname + ".uroughness"))
                        {
                            var vals = line.Split('=')[1].Trim(new char[] { ' ', '"' });
                            if (texmap.ContainsKey(vals))
                            {
                                if (texmap[vals].TexFile.Length > 1)
                                {
                                    matermap[keyname].RoughnessTexture = new Texture(Media.Get(System.IO.Path.GetFileName(texmap[vals].TexFile)));
                                }
                                else
                                {
                                    matermap[keyname].Roughness = Math.Max(1f, texmap[vals].Value.X);
                                }
                            }
                        }
                        if (line.Contains(keyname + ".vroughness"))
                        {
                            var vals = line.Split('=')[1].Trim(new char[] { ' ', '"' });
                            if (texmap.ContainsKey(vals))
                            {
                                if (texmap[vals].TexFile.Length > 1)
                                {
                                    matermap[keyname].RoughnessTexture = new Texture(Media.Get(System.IO.Path.GetFileName(texmap[vals].TexFile)));
                                }
                                else
                                {
                                    matermap[keyname].DiffuseColor = texmap[vals].Value;
                                }
                            }
                        }
                        if (line.Contains(keyname + ".n "))
                        {
                            var vals = line.Split('=')[1].Trim(new char[] { ' ', '"' });
                            if (texmap.ContainsKey(vals))
                            {
                                if (texmap[vals].TexFile.Length > 1)
                                {
                                    matermap[keyname].NormalsTexture = new Texture(Media.Get(System.IO.Path.GetFileName(texmap[vals].TexFile)));
                                }
                            }
                        }
                        if (line.Contains(keyname + ".k ") || line.Contains(keyname + ".ks "))
                        {
                            var vals = line.Split('=')[1].Trim(new char[] { ' ', '"' });
                            if (texmap.ContainsKey(vals))
                            {
                                if (texmap[vals].TexFile.Length > 1)
                                {
                                    matermap[keyname].SpecularTexture = new Texture(Media.Get(System.IO.Path.GetFileName(texmap[vals].TexFile)));
                                }
                                else
                                {
                                    matermap[keyname].SpecularColor = texmap[vals].Value;
                                }
                            }
                        }
                    }
                    else if (line.Contains(".ply"))
                    {
                        var s   = line.Split('=')[1];
                        s       = s.Trim(' ', '"');
                        var ply = Object3dManager.LoadFromRaw(Media.Get(System.IO.Path.GetFileName(s) + ".raw"));
                        if (mat.NormalsTexture == null && mat.RoughnessTexture == null)
                        {
                            //     mat.NormalsTexture = mat.Roughness < 0.3 ? glossyNtex : fussyNtex;
                            //     mat.NormalMapScale = 100.0f;
                        }
                        var mesh = Mesh3d.Create(new Object3dInfo(ply.Vertices), mat);
                        trans.Transpose();
                        trans = trans * Matrix4.CreateScale(0.6f) * Matrix4.CreateRotationX(MathHelper.DegreesToRadians(-90.0f));
                        mesh.GetInstance(0).Transformation.SetPosition(trans.ExtractTranslation());
                        mesh.GetInstance(0).Transformation.SetOrientation(trans.ExtractRotation());
                        mesh.GetInstance(0).Transformation.SetScale(trans.ExtractScale());
                        scene.Add(mesh);
                        mat   = new GenericMaterial();
                        trans = Matrix4.Identity;
                    }
                    else if (line.Contains(".material"))
                    {
                        var vals = line.Split('=')[1].Trim(new char[] { ' ', '"' });
                        if (matermap.ContainsKey(vals))
                        {
                            mat = matermap[vals];
                        }
                    }
                    if (line.Contains(".transformation"))
                    {
                        var s       = line.Split('=')[1];
                        s           = s.Trim(' ');
                        var numbers = s.Split(' ');
                        for (int f = 0; f < numbers.Length; f++)
                        {
                            trans[f % 4, (int)Math.Floor((float)f / 4)] = StringToFloat(numbers[f]);
                        }
                    }
                }

                //DynamicCubeMapController.Create();
                DynamicCubeMapController.Create();
            });
        }
Пример #16
0
        public static List <Light> AddControllableLight()
        {
            float fovdegree = 90;

            RedLight = new List <Light>();
            RedLight.Add(new Light(new TransformationManager(new Vector3(0, 5, 0), Quaternion.FromAxisAngle(new Vector3(1, 0, 0), MathHelper.DegreesToRadians(-110))))
            {
                Color = new Vector3(1) * 400,
                ShadowMappingEnabled = true,
                ShadowMapType        = Light.ShadowMapTypeEnum.Single
            });
            Picked = RedLight[0];

            /*
             * //crazyiness
             * var tmp = new List<Light>();
             * for(int i = 0; i < 10; i++)
             * {
             *  for(int g = 0; g < 4; g++)
             *  {
             *      var l = new Light(new TransformationManager(new Vector3((i - 5) * 1.6f, 1 + g * 2, 0)));
             *      tmp.Add(l);
             *      //l.Color = (new Vector3((float)Math.Sin(i), 1.0f - (float)Math.Sin(i), (float)Math.Cos(i)) * 0.5f + new Vector3(0.5f)) * 0.3f;
             *      l.Color = new Vector3(1) * (0.05f * (g + 1));
             *      l.CutOffDistance = 30.0f;
             *      l.StaticShadowMap = true;
             *      l.ShadowMapType = Light.ShadowMapTypeEnum.Cubemap;
             *      l.ShadowsQuality = ShadowMapQuality.Low;
             *      l.ShadowMappingEnabled = true;
             *      Game.World.Scene.Add(l);
             *  }
             * }
             * int ix = 0;
             * Game.OnBeforeDraw += (x, d) =>
             * {
             *  tmp[ix].ShadowMapRefreshNeeded = true;
             *  ix++;
             *  if(ix >= tmp.Count)
             *      ix = 0;
             * };*/

            //RedLight[0].camera.UpdatePerspective(1, MathHelper.DegreesToRadians(90), 0.01f, 100);

            /* RedLight.Add(new ProjectionLight(new Vector3(65, 0, 65), Quaternion.FromAxisAngle(new Vector3(1, 0, -1), MathHelper.DegreesToRadians(fovdegree)), 1, 1, MathHelper.DegreesToRadians(45), 0.1f, 100.0f)
             * {
             *   LightColor = new Vector3(1, 0.84f, 0.93f) * 25,
             *   IsStatic = true
             * });
             * RedLight.Add(new ProjectionLight(new Vector3(65, 0, 65), Quaternion.FromAxisAngle(new Vector3(1, 0, -1), MathHelper.DegreesToRadians(fovdegree)), 1, 1, MathHelper.DegreesToRadians(45), 0.1f, 100.0f)
             * {
             *   LightColor = new Vector3(1, 0.84f, 0.93f) * 25,
             *   IsStatic = true
             * });
             * RedLight.Add(new ProjectionLight(new Vector3(65, 0, 65), Quaternion.FromAxisAngle(new Vector3(1, 0, -1), MathHelper.DegreesToRadians(fovdegree)), 1, 1, MathHelper.DegreesToRadians(45), 0.1f, 100.0f)
             * {
             *   LightColor = new Vector3(1, 0.84f, 0.93f) * 25,
             *   IsStatic = true
             * });*/
            //redConeLight.BuildOrthographicProjection(600, 600, -150, 150);

            Game.OnKeyUp += (o, e) =>
            {
                if (e.Key == OpenTK.Input.Key.J)
                {
                    fovdegree += 5f;
                    if (fovdegree >= 180)
                    {
                        fovdegree = 179;
                    }
                    RedLight.ForEach((ax) => ax.Angle = MathHelper.DegreesToRadians(fovdegree));
                }
                if (e.Key == OpenTK.Input.Key.K)
                {
                    fovdegree -= 5f;
                    if (fovdegree <= 10)
                    {
                        fovdegree = 10;
                    }
                    RedLight.ForEach((ax) => ax.Angle = MathHelper.DegreesToRadians(fovdegree));
                }
            };
            RedLight.ForEach((a) => Game.World.Scene.Add(a));

            Game.OnMouseMove += (o, e) =>
            {
                MouseX = e.X;
                MouseY = e.Y;

                var kb = OpenTK.Input.Keyboard.GetState();
                if (kb.IsKeyDown(OpenTK.Input.Key.T))
                {
                    FreeCam.Freeze = true;
                    if (Picked != null)
                    {
                        Picked.SetPosition(Picked.GetPosition() + FreeCam.Cam.GetOrientation().GetTangent(MathExtensions.TangentDirection.Right) * (float)e.XDelta * -0.01f);
                        Picked.SetPosition(Picked.GetPosition() + FreeCam.Cam.GetOrientation().GetTangent(MathExtensions.TangentDirection.Up) * (float)e.YDelta * -0.01f);
                    }
                }
                else if (kb.IsKeyDown(OpenTK.Input.Key.F))
                {
                    FreeCam.Freeze = true;
                    if (Picked != null)
                    {
                        Picked.SetOrientation(Quaternion.Multiply(Picked.GetOrientation(), Quaternion.FromAxisAngle(FreeCam.Cam.GetOrientation().GetTangent(MathExtensions.TangentDirection.Up), (float)e.XDelta * -0.01f)));
                        Picked.SetOrientation(Quaternion.Multiply(Picked.GetOrientation(), Quaternion.FromAxisAngle(FreeCam.Cam.GetOrientation().GetTangent(MathExtensions.TangentDirection.Left), (float)e.YDelta * -0.01f)));
                    }
                }
                else if (kb.IsKeyDown(OpenTK.Input.Key.C))
                {
                    FreeCam.Freeze = true;
                    if (Picked != null)
                    {
                        Picked.SetScale(Picked.GetScale() + new Vector3((float)e.XDelta * -0.01f));
                    }
                }
                else
                {
                    FreeCam.Freeze = Game.DisplayAdapter.IsCursorVisible;
                }
            };
            Game.OnMouseWheel += (o, e) =>
            {
                Camera.Current.LensBlurAmount -= e.Delta / 2.0f;
            };
            Game.OnAfterDraw += (o, e) =>
            {
                //.ToString(System.Globalization.CultureInfo.InvariantCulture)

                //SettingsController.Instance.UpdatePerformance();

                /*var jpad = OpenTK.Input.GamePad.GetState(0);
                 * float deadzone = 0.15f;
                 * if(Picked != null)
                 * {
                 *  if(Math.Abs(jpad.ThumbSticks.Right.X) > deadzone)
                 *  {
                 *      var ang = Picked.GetOrientation().GetTangent(MathExtensions.TangentDirection.Up);
                 *      Picked.Rotate(Quaternion.FromAxisAngle(ang, jpad.ThumbSticks.Right.X * 0.01f));
                 *  }
                 *  if(Math.Abs(jpad.ThumbSticks.Right.Y) > deadzone)
                 *  {
                 *      var ang = Picked.GetOrientation().GetTangent(MathExtensions.TangentDirection.Left);
                 *      Picked.Rotate(Quaternion.FromAxisAngle(ang, jpad.ThumbSticks.Right.Y * 0.01f));
                 *  }
                 *  if(Math.Abs(jpad.Triggers.Left) > deadzone)
                 *  {
                 *      var ang = Picked.GetOrientation().ToDirection();
                 *      Picked.Rotate(Quaternion.FromAxisAngle(ang, jpad.Triggers.Left * 0.01f));
                 *  }
                 *  if(Math.Abs(jpad.Triggers.Right) > deadzone)
                 *  {
                 *      var ang = Picked.GetOrientation().ToDirection();
                 *      Picked.Rotate(Quaternion.FromAxisAngle(ang, -jpad.Triggers.Right*0.01f));
                 *  }
                 * }*/
                var kb = OpenTK.Input.Keyboard.GetState();
                if (Game.DisplayAdapter.IsCursorVisible)
                {
                    if (!kb.IsKeyDown(OpenTK.Input.Key.LControl))
                    {
                        //Game.DisplayAdapter.Pipeline.PostProcessor.ShowSelected = false;
                    }
                    else
                    {
                        //Game.DisplayAdapter.Pipeline.PostProcessor.ShowSelected = true;
                        PickingResult.MapData(Vector4.One);
                        MousePicker.Use();
                        var state = OpenTK.Input.Mouse.GetState();
                        MousePicker.SetUniform("Mouse", new Vector2(MouseX, Game.Resolution.Height - MouseY));
                        MousePicker.SetUniform("Resolution", new Vector2(Game.Resolution.Width, Game.Resolution.Height));
                        PickingResult.Use(0);
                        GL.ActiveTexture(TextureUnit.Texture29);
                        GL.BindTexture(TextureTarget.Texture2D, Game.DisplayAdapter.MainRenderer.MRT.TexMeshIds);
                        MousePicker.Dispatch(1, 1, 1);
                        OpenTK.Graphics.OpenGL4.GL.MemoryBarrier(OpenTK.Graphics.OpenGL4.MemoryBarrierFlags.ShaderStorageBarrierBit);
                        byte[] result = PickingResult.Read(0, 4);
                        uint   id     = BitConverter.ToUInt32(result, 0);
                        foreach (var m in Game.World.Scene.GetFlatRenderableList())
                        {
                            if (m is Mesh3d)
                            {
                                foreach (var inst in (m as Mesh3d).GetInstances())
                                {
                                    if (inst.Id == id)
                                    {
                                        Picked     = inst;
                                        PickedMesh = (m as Mesh3d);
                                        //SettingsController.Instance.SetMesh(inst);
                                    }
                                }
                            }
                        }
                    }
                }

                /*
                 * if(kb.IsKeyDown(OpenTK.Input.Key.Plus))
                 * {
                 *  var dir = Game.CascadeShadowMaps.GetDirection();
                 *  dir = Quaternion.Multiply(Quaternion.FromAxisAngle(Vector3.UnitX, -0.01f), dir);
                 *  Game.CascadeShadowMaps.SetDirection(dir);
                 * }
                 *
                 * if(kb.IsKeyDown(OpenTK.Input.Key.Minus))
                 * {
                 *  var dir = Game.CascadeShadowMaps.GetDirection();
                 *  dir = Quaternion.Multiply(Quaternion.FromAxisAngle(Vector3.UnitX, 0.01f), dir);
                 *  Game.CascadeShadowMaps.SetDirection(dir);
                 * }*/

                if (kb.IsKeyDown(OpenTK.Input.Key.T) && Picked != null)
                {
                    if (kb.IsKeyDown(OpenTK.Input.Key.Keypad4))
                    {
                        Picked.Translate(new Vector3(-0.01f, 0, 0));
                    }
                    if (kb.IsKeyDown(OpenTK.Input.Key.Keypad6))
                    {
                        Picked.Translate(new Vector3(0.01f, 0, 0));
                    }
                    if (kb.IsKeyDown(OpenTK.Input.Key.Keypad8))
                    {
                        Picked.Translate(new Vector3(0, 0, 0.01f));
                    }
                    if (kb.IsKeyDown(OpenTK.Input.Key.Keypad2))
                    {
                        Picked.Translate(new Vector3(0, 0, -0.01f));
                    }
                    if (kb.IsKeyDown(OpenTK.Input.Key.Keypad7))
                    {
                        Picked.Translate(new Vector3(0, 0.01f, 0));
                    }
                    if (kb.IsKeyDown(OpenTK.Input.Key.Keypad1))
                    {
                        Picked.Translate(new Vector3(0, -0.01f, 0));
                    }
                }
                if (kb.IsKeyDown(OpenTK.Input.Key.C) && Picked != null)
                {
                    if (kb.IsKeyDown(OpenTK.Input.Key.Keypad8))
                    {
                        Picked.Scale(1.01f);
                    }
                    if (kb.IsKeyDown(OpenTK.Input.Key.Keypad1))
                    {
                        Picked.Scale(0.99f);
                    }
                }

                var rd = new Random();/*
                                       * if(kb.IsKeyDown(OpenTK.Input.Key.Left))
                                       * {
                                       * var pos = RedLight[0].camera.Transformation.GetPosition();
                                       * RedLight.ForEach((ax) => ax.camera.Transformation.SetPosition(pos + Vector3.UnitX / 12.0f));
                                       * }
                                       * if(kb.IsKeyDown(OpenTK.Input.Key.Right))
                                       * {
                                       * var pos = RedLight[0].camera.Transformation.GetPosition();
                                       * redConeLight.camera.Transformation.SetPosition(pos - Vector3.UnitX / 12.0f);
                                       * }
                                       * if(kb.IsKeyDown(OpenTK.Input.Key.Up))
                                       * {
                                       * var pos = RedLight[0].camera.Transformation.GetPosition();
                                       * redConeLight.camera.Transformation.SetPosition(pos + Vector3.UnitZ / 12.0f);
                                       * }
                                       * if(kb.IsKeyDown(OpenTK.Input.Key.Down))
                                       * {
                                       * var pos = RedLight[0].camera.Transformation.GetPosition();
                                       * redConeLight.camera.Transformation.SetPosition(pos - Vector3.UnitZ / 12.0f);
                                       * }
                                       * if(kb.IsKeyDown(OpenTK.Input.Key.PageUp))
                                       * {
                                       * var pos = RedLight[0].camera.Transformation.GetPosition();
                                       * redConeLight.camera.Transformation.SetPosition(pos + Vector3.UnitY / 12.0f);
                                       * }
                                       * if(kb.IsKeyDown(OpenTK.Input.Key.PageDown))
                                       * {
                                       * var pos = RedLight[0].camera.Transformation.GetPosition();
                                       * redConeLight.camera.Transformation.SetPosition(pos - Vector3.UnitY / 12.0f);
                                       * }*/
                /*if(kb.IsKeyDown(OpenTK.Input.Key.U))
                 * {
                 *  var quat = Quaternion.FromAxisAngle(sun.Orientation.GetTangent(MathExtensions.TangentDirection.Left), -0.01f);
                 *  sun.Orientation = Quaternion.Multiply(sun.Orientation, quat);
                 * }
                 * if(kb.IsKeyDown(OpenTK.Input.Key.J))
                 * {
                 *  var quat = Quaternion.FromAxisAngle(sun.Orientation.GetTangent(MathExtensions.TangentDirection.Left), 0.01f);
                 *  sun.Orientation = Quaternion.Multiply(sun.Orientation, quat);
                 * }
                 * if(kb.IsKeyDown(OpenTK.Input.Key.H))
                 * {
                 *  var quat = Quaternion.FromAxisAngle(Vector3.UnitY, -0.01f);
                 *  sun.Orientation = Quaternion.Multiply(sun.Orientation, quat);
                 * }
                 * if(kb.IsKeyDown(OpenTK.Input.Key.K))
                 * {
                 *  var quat = Quaternion.FromAxisAngle(Vector3.UnitY, 0.01f);
                 *  sun.Orientation = Quaternion.Multiply(sun.Orientation, quat);
                 * }*/
            };
            return(RedLight);
        }
Пример #17
0
        public PhysicsTest()
        {
            var scene = Game.World.Scene;

            Game.Invoke(() =>
            {
                Object3dInfo point3dinfo = new Object3dInfo(new VertexInfo[] { new VertexInfo()
                                                                               {
                                                                                   Position = Vector3.One,
                                                                                   Normal   = Vector3.UnitZ,
                                                                                   UV       = Vector2.Zero
                                                                               } });
                Object3dInfo point3dinfo2 = Object3dGenerator.CreateCube(Vector3.One * 0.1f, Vector2.One).AsObject3dInfo();
                OpenTK.Graphics.OpenGL4.GL.PointSize(111);
                GenericMaterial whitemat = new GenericMaterial()
                {
                    DiffuseColor = Vector3.One
                };
                Mesh3d points = Mesh3d.Create(point3dinfo2, whitemat);
                //point3dinfo.DrawMode = OpenTK.Graphics.OpenGL4.PrimitiveType.Points;
                //whitemat.CustomShaderProgram = ShaderProgram.Compile("Points.vertex.glsl", "Points.fragment.glsl");
                points.ClearInstances();

                ComputeShader updateShader       = new ComputeShader("PhysicsUpdater.compute.glsl");
                ShaderStorageBuffer pointsBuffer = new ShaderStorageBuffer();
                var parts         = new List <Particle>();
                List <byte> bytes = new List <byte>();
                for (int i = 0; i < 1024 * 2; i++)
                {
                    var part = new Particle()
                    {
                        Position = new Vector3(rand(-20, 20), rand(0, 20), rand(-10, 10)),
                        Velocity = Vector3.Zero
                    };
                    points.AddInstance(new TransformationManager(part.Position));

                    bytes.AddRange(BitConverter.GetBytes(part.Position.X));
                    bytes.AddRange(BitConverter.GetBytes(part.Position.Y));
                    bytes.AddRange(BitConverter.GetBytes(part.Position.Z));
                    bytes.AddRange(BitConverter.GetBytes(part.Position.X));

                    bytes.AddRange(BitConverter.GetBytes(part.Velocity.X));
                    bytes.AddRange(BitConverter.GetBytes(part.Velocity.Y));
                    bytes.AddRange(BitConverter.GetBytes(part.Velocity.Z));
                    bytes.AddRange(BitConverter.GetBytes(part.Velocity.X));
                }
                pointsBuffer.MapData(bytes.ToArray());

                pointsBuffer.Use(9);
                Game.OnBeforeDraw += (z, x) =>
                {
                    updateShader.Use();
                    pointsBuffer.Use(9);
                    updateShader.SetUniform("ParticlesCount", 1024 * 2);
                    updateShader.Dispatch(2, 1, 1);

                    pointsBuffer.Use(9);
                };

                points.UpdateMatrix();
                scene.Add(points);
            });
        }
Пример #18
0
        public OldCityScene()
        {
            /*  var scene = Object3dInfo.LoadSceneFromObj(Media.Get("desertcity.obj"), Media.Get("desertcity.mtl"), 1.0f);
             * foreach(var ob in scene)
             * {
             *    ob.SetMass(0);
             *    this.Add(ob);
             * }*/
            // var scene = Object3dInfo.LoadSceneFromObj(Media.Get("cryteksponza.obj"),
            // Media.Get("cryteksponza.mtl"), 0.03f);

            var cube = VEngine.Generators.Object3dGenerator.CreateCube(new Vector3(300), new Vector2(10, 10));

            cube.ReverseFaces();
            var mesh = Mesh3d.Create(new Object3dInfo(cube.Vertices), new GenericMaterial()
            {
                Roughness     = 1.0f,
                DiffuseColor  = new Vector3(20),
                SpecularColor = Vector3.Zero
            });
            //  Game.World.Scene.Add(mesh);

            var scene = new GameScene("Scene.scene");

            scene.Load();
            // var scene = Object3dManager.LoadFromObj(Media.Get("originalsponza.obj"));
            var cnt = scene.Meshes.Count;
            var sc  = new Vector3(2.0f, 2.0f, 2.0f);

            // VoxelGI gi = Game.DisplayAdapter.MainRenderer.VXGI;
            Game.Invoke(() =>
            {
                //PassiveVoxelizer vox = new PassiveVoxelizer();
                Random rand = new Random();

                for (var i = 0; i < cnt; i++)
                {
                    var o = scene.Meshes[i];
                    var b = o.GetInstance(0).GetPosition();
                    b     = new Vector3(b.X * 0.25f, b.Y * 0.25f, b.Z * 0.25f);
                    o.GetInstance(0).SetPosition(b);
                    o.GetInstance(0).Scale(0.25f);
                    o.GetInstance(0).Translate(0, 0, 0);
                    // var bdshape = o.GetLodLevel(0).Info3d.GetConvexHull();
                    // var bd = Game.World.Physics.CreateBody(0, o.GetInstance(0), bdshape);
                    // bd.Enable();
                    Game.World.Scene.Add(o);

                    /*
                     * // voxelize
                     * float acceptableVoxelSize = 0.2f;
                     * Object3dManager mgm = scene[i];
                     * mgm.RecalulateNormals(Object3dManager.NormalRecalculationType.Flat);
                     * var aabb = mgm.GetAxisAlignedBox();
                     * var aabbEx = mgm.GetAxisAlignedBoxEx();
                     * float maxbba = max(aabb.X, aabb.Y, aabb.Z);
                     * //// if(maxbba > 9.0)
                     * //      continue;
                     * float divc = maxbba / acceptableVoxelSize;
                     * int grid = min(32, (int)Math.Floor(divc));
                     *
                     * Console.WriteLine("VOXELIZING:: {0} GRID SIZE:: {1}", o.GetInstance(0).Name, grid);
                     *
                     * var voxels = vox.Voxelize(mgm, grid);
                     * var vw = new Vector3(
                     *  (float)rand.NextDouble(),
                     *  (float)rand.NextDouble(),
                     *  (float)rand.NextDouble()
                     * );
                     * voxels.ForEach((a) => a.Albedo = vw*0.01f);
                     * Console.WriteLine("RESULT COUNT:: {0}", voxels.Count);
                     *
                     * var container = new VoxelGI.VoxelContainer(aabbEx[0], aabbEx[1], voxels);
                     * o.GIContainer = containers.Count;
                     * containers.Add(container);*/

                    o.GetLodLevel(0).Info3d.Manager = null;
                    //   bd.Enable();
                }
                //gi.UpdateVoxels(containers);
                Game.OnBeforeDraw += (aa, aaa) =>
                {
                    //  gi.UpdateGI();
                };
                //var lucy = CreateDiffuseModelFromRaw("lucy.vbo.raw", new Vector3(1));
                var lucy = CreateDiffuseModelFromObj("hipolysphere.obj", new Vector3(1));
                Game.World.Scene.Add(lucy);
                lucy.GetInstance(0).Scale(0.3f);
                //lucy.GetLodLevel(0).Material.SetNormalsTexture("stonew_n.jpg");
                lucy.GetLodLevel(0).Material.DiffuseColor = new Vector3(1.0f);

                //DynamicCubeMapController.Create();
            });


            //   var sss = Object3dManager.LoadSceneFromObj("sintel.obj", "sintel.mtl");
            //  sss.ForEach((a) => Game.World.Scene.Add(a));

            /*
             * SimplePointLight spl = new SimplePointLight(new Vector3(0, 2, 0), new Vector3(12, 12, 12));
             * spl.Angle = 90;
             * spl.SetOrientation(new Vector3(1, -1, 0).ToQuaternion(Vector3.UnitY));
             * float t = 0;
             * Game.OnUpdate += (z, xx) =>{
             *  spl.SetPosition((float)Math.Sin(t), 2, 0);
             *      t += (float)0.01;
             * };
             * Game.World.Scene.Add(spl);*/
            /*
             * var lss = new List<SimplePointLight>();
             * for(int x = 0; x < 500; x++)
             * {
             *  SimplePointLight light = new SimplePointLight(new Vector3(-4 + (8 * (x/100.0f)), 1, 0), new Vector4((float)Math.Sin(x * 0.1), (float)Math.Cos(x*0.6), (float)Math.Tan(x * 0.9), 1.0f));
             *  Game.World.Scene.Add(light);
             *  lss.Add(light);
             * }
             *
             * Game.OnBeforeDraw += (oo, ee) =>
             * {
             *  float a = (float)(DateTime.Now - Game.StartTime).TotalMilliseconds / 1000;
             *  for(int x = 0; x < 100; x++)
             *  {
             *      lss[x].SetPosition(new Vector3(-4 + (8 * (x / 100.0f)), 1 + (float)Math.Sin(x * 0.1 + a), (float)Math.Cos(x * 0.6 + a)));
             *  }
             * };*/

            // var viperobj = Object3dManager.LoadSceneFromObj(Media.Get("viper.obj"), Media.Get("viper.mtl"), 0.1f);
            // viperobj.ForEach((a) => a.GetInstance(0).Rotate(Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(90))));
            //  viperobj.ForEach((a) => Game.World.Scene.Add(a));

            /*   var lucy2 = Mesh3d.Create(new Object3dInfo(Object3dManager.LoadFromRaw(Media.Get("lucy.vbo.raw")).Vertices), GenericMaterial.FromColor(Color.Gold));
             * lucy2.GetInstance(0).Scale(0.2f);
             * lucy2.GetLodLevel(0).Material.Roughness = 0.2f;
             * lucy2.GetLodLevel(0).Material.Metalness = 0.01f;
             * Game.World.Scene.Add(lucy2);*/
            /*
             * var barrelmanager = Object3dManager.LoadFromObjSingle(Media.Get("barrel.obj"));
             * var barrelinfo = new Object3dInfo(barrelmanager.Vertices);
             * var barrelshape = Physics.CreateConvexCollisionShape(barrelmanager);
             * var barrels = Mesh3d.Create(barrelinfo, new GenericMaterial());
             * barrels.AutoRecalculateMatrixForOver16Instances = true;
             * barrels.GetLodLevel(0).Material.Roughness = 0.0f;
             * barrels.ClearInstances();
             *
             * Game.OnKeyUp += (ox, oe) =>
             * {
             * if(oe.Key == OpenTK.Input.Key.Keypad0)
             * {
             *   var instance = barrels.AddInstance(new TransformationManager(Camera.MainDisplayCamera.GetPosition()));
             *   var phys = Game.World.Physics.CreateBody(0.7f, instance, barrelshape);
             *   phys.Enable();
             *   phys.Body.LinearVelocity += Camera.MainDisplayCamera.GetDirection() * 6;
             * }
             * };
             * Game.World.Scene.Add(barrels);*/
            // DynamicCubeMapController.Create();

            /*
             * List<Mesh3d> cubes = new List<Mesh3d>();
             * for(int i = 0; i < 80; i++)
             *  cubes.Add(new Mesh3d(Object3dInfo.LoadFromObjSingle(Media.Get("normalizedcube.obj")), new GenericMaterial(Color.White)));
             * cubes.ForEach((a) => Game.World.Scene.Add(a));
             *
             * List<SimplePointLight> lights = new List<SimplePointLight>();
             * for(int i = 0; i < 80; i++)
             * {
             *  lights.Add(new SimplePointLight(new Vector3(0), Vector4.Zero));
             *  Game.World.Scene.Add(lights[i]);
             * }
             *  Game.OnBeforeDraw += (o, e) =>
             * {
             *  float timeadd = (float)(DateTime.Now - Game.StartTime).TotalMilliseconds * 0.00001f;
             *  for(int x = 0; x < 80; x++)
             *  {
             *      var center = new Vector3((x - 40) * 0.1f, (float)Math.Cos(x+ timeadd * x), (float)Math.Sin(x + timeadd * x));
             *      lights[x].SetPosition(center);
             *      lights[x].Color = new Vector4((float)Math.Sin(x + timeadd * x), (float)Math.Cos(x + timeadd * x), (float)Math.Cos(x + timeadd * 3 * x), 0.1f);
             *
             *      cubes[x].MainMaterial.Color = lights[x].Color;
             *      cubes[x].Transformation.SetPosition(center);
             *      cubes[x].Transformation.SetScale(0.05f);
             *  }
             * };*/
            /*
             * var scene = new VEngine.FileFormats.GameScene("home1.scene");
             * //var instances = InstancedMesh3d.FromMesh3dList(testroom);
             * scene.OnObjectFinish += (o, a) =>
             * {
             *  if(!(a is Mesh3d))
             *      return;
             *  var ob = a as Mesh3d;
             *  ob.SetOrientation(ob.GetPosition());
             *  //ob.SetCollisionShape(ob.MainObjectInfo.GetAccurateCollisionShape());
             *  //ob.SpecularComponent = 0.1f;
             *  //ob.MainMaterial.ReflectionStrength = ob.MainMaterial.SpecularComponent;
             *  //ob.SetCollisionShape(ob.ObjectInfo.GetAccurateCollisionShape());
             *  // ob.Material = new SolidColorMaterial(new Vector4(1, 1, 1, 0.1f));
             *  //(ob.MainMaterial as GenericMaterial).Type = GenericMaterial.MaterialType.WetDrops;
             *  //(ob.MainMaterial as GenericMaterial).BumpMap = null;
             *  this.Add(ob);
             * };
             * scene.Load();
             * SimplePointLight p = new SimplePointLight(new Vector3(0, 3, 0), new Vector4(-2.2f, -2.2f, -2.2f, 2.6f));
             * //LightPool.Add(p);
             * Game.OnKeyPress += (o, e) =>
             * {
             *  if(e.KeyChar == 'o')
             *      p.Color = new Vector4(p.Color.X + 1.1f, p.Color.Y + 1.1f, p.Color.Z + 1.1f, p.Color.W);
             *  if(e.KeyChar == 'l')
             *      p.Color = new Vector4(p.Color.X - 1.1f, p.Color.Y - 1.1f, p.Color.Z - 1.1f, p.Color.W);
             *  if(e.KeyChar == 'i')
             *      p.Color = new Vector4(p.Color.X, p.Color.Y, p.Color.Z, p.Color.W + 1);
             *  if(e.KeyChar == 'k')
             *      p.Color = new Vector4(p.Color.X, p.Color.Y, p.Color.Z, p.Color.W - 1);
             * };*/
            // var s = VEngine.FileFormats.GameScene.FromMesh3dList(scene);
            // System.IO.File.WriteAllText("Scene.scene", s); Object3dInfo[] skydomeInfo =
            // Object3dInfo.LoadFromObj(Media.Get("sponza_verysimple.obj")); var sponza =
            // Object3dInfo.LoadSceneFromObj(Media.Get("cryteksponza.obj"),
            // Media.Get("cryteksponza.mtl"), 0.03f); List<Mesh3d> meshes = new List<Mesh3d>();

            /*   List<GenericMaterial> mats = new List<GenericMaterial>
             * {
             *     new GenericMaterial(new Vector4(1f, 0.6f, 0.6f, 1.0f)) {Roughness = 0.2f },
             *     new GenericMaterial(new Vector4(0.9f, 0.9f, 0.9f, 1.0f)) {Roughness = 0.5f },
             *     new GenericMaterial(new Vector4(0.6f, 0.6f, 1f, 1.0f)) {Roughness = 0.2f },
             *     new GenericMaterial(new Vector4(1, 1, 2.05f, 1.0f)) {Roughness = 0.8f },
             *     new GenericMaterial(new Vector4(0.6f, 1f, 1f, 1.0f)) {Roughness = 0.2f },
             *     new GenericMaterial(new Vector4(1f, 0.6f, 1f, 1.0f)),
             *     new GenericMaterial(new Vector4(1, 0, 0.1f, 1.0f)),
             *     new GenericMaterial(new Vector4(1, 0, 0.1f, 1.0f)),
             *     new GenericMaterial(new Vector4(1, 0, 0.1f, 1.0f)),
             *     new GenericMaterial(new Vector4(1, 0, 0.1f, 1.0f)),
             * };
             * int ix = 0;
             * foreach(var sd in skydomeInfo)
             * {
             *     var skydomeMaterial = mats[ix++ % mats.Count];
             *     var skydome = new Mesh3d(sd, skydomeMaterial);
             *     skydome.Scale(3);
             *     meshes.Add(skydome);
             * }*/
            // var Tracer = new PathTracer(); Tracer.PrepareTrianglesData(meshes);

            /* List<Triangle> triangles = new List<Triangle>();
             * foreach(var mesh in scene)
             * {
             *   var Triangle = new Triangle();
             *   Triangle.Tag = mesh;
             *   var vertices = mesh.MainObjectInfo.GetOrderedVertices();
             *   var normals = mesh.MainObjectInfo.GetOrderedNormals();
             *   for(int i = 0; i < vertices.Count; i++)
             *   {
             *       var vertex = new Vertex()
             *       {
             *           Position = vertices[i],
             *           Normal = normals[i],
             *           Albedo = mesh.MainMaterial.Color.Xyz
             *       };
             *       vertex.Tranform(mesh.Matrix);
             *       Triangle.Vertices.Add(vertex);
             *       if(Triangle.Vertices.Count == 3)
             *       {
             *           triangles.Add(Triangle);
             *           Triangle = new Triangle();
             *           Triangle.Tag = mesh;
             *       }
             *   }
             * }
             * SceneOctalTree tree = new SceneOctalTree();
             * Triangle[] trcopy = new Triangle[triangles.Count];
             * triangles.CopyTo(trcopy);
             * tree.CreateFromTriangleList(trcopy.ToList());
             * var TriangleCount = triangles.Count;
             * // lets prepare byte array layout posx, posy, poz, norx, nory, norz, albr, albg, albz
             * List<byte> bytes = new List<byte>();
             * foreach(var triangle in triangles)
             * {
             *   foreach(var vertex in triangle.Vertices)
             *   {
             *       bytes.AddRange(BitConverter.GetBytes(vertex.Position.X));
             *       bytes.AddRange(BitConverter.GetBytes(vertex.Position.Y));
             *       bytes.AddRange(BitConverter.GetBytes(vertex.Position.Z));
             *       bytes.AddRange(BitConverter.GetBytes((float)(triangle.Tag as Mesh3d).MainMaterial.Roughness));
             *
             *       bytes.AddRange(BitConverter.GetBytes(vertex.Normal.X));
             *       bytes.AddRange(BitConverter.GetBytes(vertex.Normal.Y));
             *       bytes.AddRange(BitConverter.GetBytes(vertex.Normal.Z));
             *       bytes.AddRange(BitConverter.GetBytes(0.0f));
             *
             *       bytes.AddRange(BitConverter.GetBytes(vertex.Albedo.X));
             *       bytes.AddRange(BitConverter.GetBytes(vertex.Albedo.Y));
             *       bytes.AddRange(BitConverter.GetBytes(vertex.Albedo.Z));
             *       bytes.AddRange(BitConverter.GetBytes(0.0f));
             *   }
             * }
             * var octree = new SceneOctalTree();
             * octree.CreateFromTriangleList(triangles);
             * InstancedMesh3d ims = new InstancedMesh3d(Object3dInfo.LoadFromObjSingle(Media.Get("normalizedcube.obj")), new GenericMaterial(Color.White));
             * Action<SceneOctalTree.Box> a = null;
             * a = new Action<SceneOctalTree.Box>((box) =>
             * {
             *   if(box.Children.Count == 0)
             *       ims.Transformations.Add(new TransformationManager(new Vector3(box.Center), Quaternion.Identity, box.Radius));
             *   else
             *       foreach(var b in box.Children)
             *           a(b);
             * });
             * foreach(var b in octree.BoxTree.Children)
             * {
             *   a(b);
             * }
             * ims.UpdateMatrix();
             * Add(ims);
             */
            //   PostProcessing.Tracer = Tracer;
            //var protagonist = Object3dInfo.LoadSceneFromObj(Media.Get("protagonist.obj"), Media.Get("protagonist.mtl"), 1.0f);
            //foreach(var o in protagonist)
            //    Add(o);

            /*
             * var fountainWaterObj = Object3dInfo.LoadFromObjSingle(Media.Get("turbinegun.obj"));
             * var water = new Mesh3d(fountainWaterObj, new GenericMaterial(new Vector4(1, 1, 1, 1)));
             * water.Transformation.Scale(1.0f);
             * water.Translate(0, 10, 0);
             * Add(water);*/
            /*
             * Object3dInfo waterInfo = Object3dGenerator.CreateTerrain(new Vector2(-200, -200), new Vector2(200, 200), new Vector2(30, 30), Vector3.UnitY, 333, (x, y) => 0);
             *
             * var color = new GenericMaterial(Color.SkyBlue);
             * color.SetBumpMapFromMedia("cobblestone.jpg");
             * // color.Type = GenericMaterial.MaterialType.Water;
             * Mesh3d water2 = new Mesh3d(waterInfo, color);
             * water2.SetMass(0);
             * color.Roughness = 0.8f;
             * water2.Translate(0, 0.1f, 0);
             * water2.MainMaterial.ReflectionStrength = 1;
             * //water.SetCollisionShape(new BulletSharp.StaticPlaneShape(Vector3.UnitY, 0));
             * Add(water2);
             * var dragon3dInfo = Object3dInfo.LoadFromObjSingle(Media.Get("apple.obj"));
             * dragon3dInfo.ScaleUV(0.1f);
             * var mat = GenericMaterial.FromMedia("skin.jpg");
             * var dragon = new Mesh3d(dragon3dInfo, mat);
             * //mat.Type = GenericMaterial.MaterialType.WetDrops;
             * //dragon.Scale(5);
             * dragon.SetMass(0);
             * dragon.SetCollisionShape(dragon3dInfo.GetAccurateCollisionShape());
             * Add(dragon);
             * /*
             * Object3dInfo waterInfo = Object3dGenerator.CreateTerrain(new Vector2(-200, -200), new Vector2(200, 200), new Vector2(100, 100), Vector3.UnitY, 333, (x, y) => 0);
             *
             * var color = new GenericMaterial(Color.Green);
             * color.SetBumpMapFromMedia("grassbump.png");
             * color.Type = GenericMaterial.MaterialType.Grass;
             * Mesh3d water = new Mesh3d(waterInfo, color);
             * water.SetMass(0);
             * water.Translate(0, 1, 0);
             * water.SetCollisionShape(new BulletSharp.StaticPlaneShape(Vector3.UnitY, 0));
             * Add(water);
             *
             * var dragon3dInfo = Object3dInfo.LoadFromRaw(Media.Get("lucymidres.vbo.raw"), Media.Get("lucymidres.indices.raw"));
             * dragon3dInfo.ScaleUV(0.1f);
             * var dragon = new Mesh3d(dragon3dInfo, new GenericMaterial(Color.White));
             * //dragon.Translate(0, 0, 20);
             * dragon.Scale(80);
             * Add(dragon);
             */
        }
Пример #19
0
        static void SaveMeshToFile(Mesh3d m, string name, string outfile)
        {
            StringBuilder materialb = new StringBuilder();
            var           mat       = m.GetLodLevel(0).Material;
            var           i3d       = m.GetLodLevel(0).Info3d;
            var           inst      = m.GetInstance(0);
            string        meshname  = name + ".mesh3d";
            string        matname   = name + ".material";

            string rawfile = name + ".raw";

            i3d.Manager.ReverseYUV(1);
            i3d.Manager.SaveRawWithTangents(outfile + "/" + rawfile);

            materialb.AppendLine(string.Format("diffuse {0} {1} {2}", ftos(mat.DiffuseColor.X), ftos(mat.DiffuseColor.Y), ftos(mat.DiffuseColor.Z)));
            materialb.AppendLine(string.Format("roughness {0}", ftos(mat.Roughness)));
            materialb.AppendLine(string.Format("metalness {0}", 0.2f));
            materialb.AppendLine();
            if (mat.NormalsTexture != null)
            {
                materialb.AppendLine("node");
                materialb.AppendLine(string.Format("texture {0}", mat.NormalsTexture.FileName));
                materialb.AppendLine("mix REPLACE");
                materialb.AppendLine("target NORMAL");
                materialb.AppendLine();
            }
            if (mat.DiffuseTexture != null)
            {
                materialb.AppendLine("node");
                materialb.AppendLine(string.Format("texture {0}", mat.DiffuseTexture.FileName));
                materialb.AppendLine("mix REPLACE");
                materialb.AppendLine("target DIFFUSE");
                materialb.AppendLine("modifier LINEARIZE");
                materialb.AppendLine();
            }
            if (mat.BumpTexture != null)
            {
                materialb.AppendLine("node");
                materialb.AppendLine(string.Format("texture {0}", mat.BumpTexture.FileName));
                materialb.AppendLine("mix REPLACE");
                materialb.AppendLine("target BUMP");
                materialb.AppendLine();
            }
            if (mat.RoughnessTexture != null)
            {
                materialb.AppendLine("node");
                materialb.AppendLine(string.Format("texture {0}", mat.RoughnessTexture.FileName));
                materialb.AppendLine("mix REPLACE");
                materialb.AppendLine("target ROUGHNESS");
                materialb.AppendLine();
            }
            File.WriteAllText(outfile + "/" + matname, materialb.ToString());

            StringBuilder meshb = new StringBuilder();

            meshb.AppendLine("lodlevel");
            meshb.AppendLine("start 0");
            meshb.AppendLine("end 99999");
            meshb.AppendLine(string.Format("info3d {0}", rawfile));
            meshb.AppendLine(string.Format("material {0}", matname));
            meshb.AppendLine();
            meshb.AppendLine("instance");
            meshb.AppendLine(string.Format("translate {0} {1} {2}", ftos(inst.Transformation.Position.R.X), ftos(inst.Transformation.Position.R.Y), ftos(inst.Transformation.Position.R.Z)));
            meshb.AppendLine(string.Format("scale {0} {1} {2}", ftos(inst.Transformation.ScaleValue.R.X), ftos(inst.Transformation.ScaleValue.R.Y), ftos(inst.Transformation.ScaleValue.R.Z)));
            meshb.AppendLine(string.Format("rotate {0} {1} {2} {3}", ftos(inst.Transformation.Orientation.R.X), ftos(inst.Transformation.Orientation.R.Y), ftos(inst.Transformation.Orientation.R.Z), ftos(inst.Transformation.Orientation.R.W)));
            File.WriteAllText(outfile + "/" + meshname, meshb.ToString());
        }