Example #1
0
    public static ArrayMesh AddNoiseToMesh(PlaneMesh plane, float[,] noiseMap, int chunkSize, int heightMultiplier, Curve heightCurve)
    {
        SurfaceTool st = new SurfaceTool();

        st.CreateFrom(plane, 0);
        ArrayMesh    mesh = new ArrayMesh();
        MeshDataTool dt   = new MeshDataTool();

        mesh = st.Commit();
        dt.CreateFromSurface(mesh, 0);
        for (int y = 0; y < chunkSize; y++)
        {
            for (int x = 0; x < chunkSize; x++)
            {
                int     z           = y;
                int     vertexIndex = z * chunkSize + x;
                Vector3 vertex      = dt.GetVertex(vertexIndex);
                vertex.y = heightCurve.Interpolate(noiseMap[chunkSize - x - 1, chunkSize - z - 1]) * heightMultiplier;
                dt.SetVertex(vertexIndex, vertex);
            }
        }
        for (int surface = 0; surface < mesh.GetSurfaceCount(); surface++)
        {
            mesh.SurfaceRemove(surface);
        }
        dt.CommitToSurface(mesh);
        st.Begin(Mesh.PrimitiveType.Triangles);
        st.CreateFrom(mesh, 0);
        st.Index();
        st.GenerateNormals();
        return(st.Commit());
    }
Example #2
0
    public override UnifiedObject Mirror()
    {
        StaticObject clone = (StaticObject)this.Clone();

        ArrayMesh originalMesh         = (ArrayMesh)this.m_meshInstance.Mesh;
        int       originalSurfaceCount = originalMesh.GetSurfaceCount();

        ArrayMesh newMesh = new ArrayMesh();

        for (int i = 0; i < originalSurfaceCount; i++)
        {
            MeshDataTool mdt = new MeshDataTool();
            mdt.CreateFromSurface(originalMesh, i);

            for (int j = 0; j < mdt.GetVertexCount(); j++)
            {
                Vector3 vert = mdt.GetVertex(j);
                vert.x *= -1;
                mdt.SetVertex(j, vert);
            }
            mdt.CommitToSurface(newMesh);
        }

        clone.ObjectMeshInstance.Mesh = newMesh;

        return(clone);
    }
Example #3
0
    public void Generate()
    {
        planeMesh                = new PlaneMesh();
        planeMesh.Size           = new Vector2(chunkSize, chunkSize);
        planeMesh.SubdivideDepth = Mathf.RoundToInt(chunkSize * 0.5f);
        planeMesh.SubdivideWidth = Mathf.RoundToInt(chunkSize * 0.5f);

        surfaceTool  = new SurfaceTool();
        meshDataTool = new MeshDataTool();
        surfaceTool.CreateFrom(planeMesh, 0);
        arrayPlane = surfaceTool.Commit();
        meshDataTool.CreateFromSurface(arrayPlane, 0);

        for (int i = 0; i < meshDataTool.GetVertexCount(); i++)
        {
            Vector3 vertex = meshDataTool.GetVertex(i);
            vertex.y = noise.GetNoise3d(
                vertex.x + position.x,
                vertex.y,
                vertex.z + position.z) * References.steepness;

            meshDataTool.SetVertex(i, vertex);
            avgHeight += vertex.y;
        }
        avgHeight /= meshDataTool.GetVertexCount();

        for (int i = 0; i < arrayPlane.GetSurfaceCount(); i++)
        {
            arrayPlane.SurfaceRemove(i);
        }

        for (int i = 0; i < meshDataTool.GetFaceCount(); i++)
        {
            Vector3 A      = meshDataTool.GetVertex(meshDataTool.GetFaceVertex(i, 0));
            Vector3 B      = meshDataTool.GetVertex(meshDataTool.GetFaceVertex(i, 1));
            Vector3 C      = meshDataTool.GetVertex(meshDataTool.GetFaceVertex(i, 2));
            Vector3 face   = (A + B + C) / 3 + position;
            Vector3 normal = meshDataTool.GetFaceNormal(i);
            slope += Maths.Angle(Vector3.Up, normal);
        }
        slope /= meshDataTool.GetFaceCount();

        meshDataTool.CommitToSurface(arrayPlane);
        surfaceTool.Begin(Mesh.PrimitiveType.Triangles);
        surfaceTool.CreateFrom(arrayPlane, 0);
        surfaceTool.GenerateNormals();

        meshInstance      = new MeshInstance();
        meshInstance.Mesh = surfaceTool.Commit();
        meshInstance.SetSurfaceMaterial(0, (Material)ResourceLoader.Load("res://Assets/Shader/Terrain.material"));
        meshInstance.CreateTrimeshCollision();
        meshInstance.CastShadow = GeometryInstance.ShadowCastingSetting.On;
        AddChild(meshInstance);
    }
Example #4
0
    private void Generate()
    {
        if (!_initialized)
        {
            return;
        }

        _surfaceTool.Clear();
        _meshDataTool.Clear();
        _surfaceTool.CreateFrom(_meshInstance.Mesh, 0);
        _meshDataTool.CreateFromSurface(_surfaceTool.Commit(), 0);

        int numVertices = _meshDataTool.GetVertexCount();

        _data = new float[numVertices];

        for (int i = 0; i < numVertices; i++)
        {
            Vector3 vertex = _meshDataTool.GetVertex(i);
            _data[i] = Amplitude * _noise.GetNoise2d(vertex.x, vertex.z);
            _meshDataTool.SetVertex(i, new Vector3(vertex.x, _data[i], vertex.z));
            _meshDataTool.SetVertexNormal(i, Vector3.Up);
        }

        for (int i = 0; i < numVertices - _resX; i++)
        {
            Vector3 a = _meshDataTool.GetVertex(i);
            Vector3 b = _meshDataTool.GetVertex(i + 1);
            Vector3 c = _meshDataTool.GetVertex(i + _resX);

            Vector3 normal = (c - a).Cross(b - a);

            for (int j = i; j < i + 3; j++)
            {
                _meshDataTool.SetVertexNormal(j, _meshDataTool.GetVertexNormal(j) + normal);
            }
        }

        for (int i = 0; i < numVertices; i++)
        {
            _meshDataTool.SetVertexNormal(i, _meshDataTool.GetVertexNormal(i).Normalized());
        }

        ArrayMesh newMesh = new ArrayMesh();

        _meshDataTool.CommitToSurface(newMesh);
        _meshInstance.Mesh = newMesh;
        _meshInstance.RemoveChild(_meshInstance.GetChild(0));
        _meshInstance.CreateTrimeshCollision();
    }
    private void Deform()
    {
        var sn = new OpenSimplexNoise();

        sn.Period      = Period;
        sn.Octaves     = Octaves;
        sn.Seed        = Seed;
        sn.Persistence = Persistence;
        sn.Lacunarity  = Lacunarity;

        var mesh = sphere.Mesh;
        var st   = new SurfaceTool();

        st.CreateFrom(mesh, 0);

        var array = st.Commit();

        var dt = new MeshDataTool();

        dt.CreateFromSurface(array, 0);

        var count  = dt.GetVertexCount();
        var origin = Vector3.Zero;

        for (int i = 0; i < count; i++)
        {
            var vertex = dt.GetVertex(i);
            var n      = -vertex.DirectionTo(origin);
            var noise  = sn.GetNoise3d(vertex.x, vertex.y, vertex.z);
            noise   = Mathf.Clamp(noise, -1f, 1f);
            vertex += n * noise * MoveFactor;
            dt.SetVertex(i, vertex);
        }
        var surfCount = array.GetSurfaceCount();

        for (int i = 0; i < surfCount; i++)
        {
            array.SurfaceRemove(i);
        }

        dt.CommitToSurface(array);
        st.Begin(Mesh.PrimitiveType.Triangles);
        st.CreateFrom(array, 0);
        st.GenerateNormals();

        sphere.Mesh = st.Commit();

        UpdateMaterial();
    }
Example #6
0
    public async void UpdateShapes()
    {
        // await System.Threading.Thread.SpinWait(1000);
        await System.Threading.Tasks.Task.Delay(100);

        try
        {
            using (var frames = pipe.WaitForFrames())
                using (var depth = frames.DepthFrame)
                    using (var points = pc.Process(depth).As <Points>())
                    {
                        // CopyVertices is extensible, any of these will do:
                        float[] vertices;
                        vertices = new float[points.Count * 3];
                        points.CopyVertices(vertices);

                        Points = vertices;
                    }

            // Remove all children from the detectbody
            foreach (Node child in detectBody.GetChildren())
            {
                child.QueueFree();
            }

            if (detectBody.GetShapeOwners().Count > 0)
            {
                GD.Print(detectBody.GetShapeOwners().Count);
                for (int l = 0; l < detectBody.GetShapeOwners().Count; l++)
                {
                    detectBody.ShapeOwnerClearShapes((uint)l);
                }
            }
        }
        catch
        {
        }
        detectedPoints.Clear();
        sortedPoints.Clear();


        Vector3 currentGroundPoint = new Vector3();

        // allPoints = new Vector3[101760];

        for (int i = 0; i < meshDataTool.GetVertexCount(); i++) // 101760
        {
            Vector3 vertex = meshDataTool.GetVertex(i);


            int   indexOfX = i * 3;
            int   indexOfY = i * 3 + 1;
            int   indexOfZ = i * 3 + 2;
            float x        = Points[indexOfX];
            float y        = Points[indexOfY];
            float z        = Points[indexOfZ];

            bool shapeFoundForPoint = false;
            // GD.Print(x);


            if (z > distanceToGround || z == 0.0f || z < 0 || x < syncPointTL.x || y > syncPointTL.y || x > syncPointBR.x || y < syncPointBR.y)
            {
                z = 0;
            }
            else
            {
                z = (distanceToGround - z) * 2;
                if (vertex.y > 0)
                {
                    currentGroundPoint   = vertex;
                    currentGroundPoint.y = 0;
                    //------------------------------------------------- For each point test --------------------------------------------------
                    if (detectedPoints.Count == 0)
                    {
                        // make a vector on the ground for the detection shape to get a height
                        List <Vector3> shapePoints = new List <Vector3> {
                            currentGroundPoint, vertex
                        };
                        detectedPoints.Add(shapePoints); // Add the vectors to a list with shapes
                    }
                    else
                    {
                        for (int j = 0; j < detectedPoints.Count; j++)                                   // Run thrugh all the shapes
                        {
                            int lengthOfShape = detectedPoints[j].Count;                                 // number of points in shape
                            // find the shape with a last added start point...
                            if (detectedPoints[j][lengthOfShape - 2].DistanceTo(currentGroundPoint) < 1) //4 distanceBetweenPoints
                            {
                                detectedPoints[j].Add(currentGroundPoint);
                                detectedPoints[j].Add(vertex);
                                shapeFoundForPoint = true;
                                break;
                            }
                        }
                        if (shapeFoundForPoint == false)
                        {
                            //... create a new shape and add the points
                            List <Vector3> shapePoints = new List <Vector3> {
                                currentGroundPoint, vertex
                            };
                            detectedPoints.Add(shapePoints);
                        }
                    }
                    shapeFoundForPoint = false;

                    //------------------------------------------------------------------------------------------------------------------------
                }
            }
            vertex.y = z;

            meshDataTool.SetVertex(i, vertex); // Draw shape
        }


        Vector3 prevPoint     = new Vector3(10, 10, 10);
        Vector3 prevprevPoint = new Vector3(10, 10, 10);


        // ---------------------------- Add points to shapes --------------------------
        for (int i = 0; i < detectedPoints.Count; i++)
        {
            // Point (000) removal
            detectedPoints[i].RemoveAll(item => item == pointZero);

            for (int j = 0; j < detectedPoints[i].Count; j++)
            {
                if (detectedPoints[i][j].z != prevprevPoint.z)
                {
                    prevprevPoint = prevPoint;
                    prevPoint     = detectedPoints[i][j];
                }
                else if (detectedPoints[i][j].z == prevprevPoint.z)
                {
                    prevprevPoint = prevPoint;
                    prevPoint     = detectedPoints[i][j];

                    detectedPoints[i].Remove(prevprevPoint);
                }
            }


            int pointSets = 100000;
            var sortOut   = detectedPoints[i].Where((x, n) => n % pointSets == 0 || n - 1 % pointSets == 0);


            Vector3[] convertedArr = sortOut.ToArray();

            // -------------------------- Must be turned on ----------------------
            convexPolygonShape = new ConvexPolygonShape();

            convexPolygonShape.Points = convertedArr;

            var areaShape = new Area();
            areaShape.AddToGroup("cameraDetections");
            DetectionCollisionShape              = new CollisionShape();
            DetectionCollisionShape.Shape        = convexPolygonShape;
            DetectionCollisionShape.Shape.Margin = 1;
            areaShape.AddChild(DetectionCollisionShape);
            detectBody.AddChild(areaShape);

            // ----------------------------------------------------------------
        }


        detectedPoints.Clear();
        sortedPoints.Clear();


        // ---------------------------- Remove surface --------------------------
        for (int j = 0; j < arrayPlane.GetSurfaceCount(); j++)
        {
            arrayPlane.SurfaceRemove(j); // Removes the drawing
        }

        meshDataTool.CommitToSurface(arrayPlane); // Resets the surface


        UpdateShapes(); // Rerun function
    }
Example #7
0
    public override void _Ready()
    {
        var mesh = new PlaneMesh();

        mesh.Size           = new Vector2(size, size);
        mesh.SubdivideDepth = 3;
        mesh.SubdivideWidth = (int)position.x == 0 ? (int)size : 3;

        var surface_tool = new SurfaceTool();

        surface_tool.CreateFrom(mesh, 0);
        var mesh_tool = new MeshDataTool();

        mesh_tool.CreateFromSurface(surface_tool.Commit(), 0);

        var biome = GetBiome(/*hydro_noise.GetNoise2dv(position / size), */ heat_noise.GetNoise2d(position.x / size / 10.0f, position.y));

        for (int i = 0; i < mesh_tool.GetVertexCount(); ++i)
        {
            var vertex            = mesh_tool.GetVertex(i);
            var vertex_global_pos = position + new Vector2(vertex.x, vertex.z);

            var height_noise_val = height_noise.GetNoise2dv(vertex_global_pos);
            vertex.y = height_noise_val * 20;
            var color_factor = (height_noise_val + 1) / 2.0f;

            var hydro_val = (int)Math.Round(hydro_noise.GetNoise2dv(vertex_global_pos));

            if ((int)vertex.x == 0 && (int)position.x == 0)
            {
                mesh_tool.SetVertexColor(i, new Color(color_factor, color_factor / 2, 0.0f));
            }
            else if (hydro_val == -1)
            {
                mesh_tool.SetVertexColor(i, biome.dry_color * color_factor);
            }
            else if (hydro_val == 1)
            {
                mesh_tool.SetVertexColor(i, biome.humid_color * color_factor);
            }
            else
            {
                mesh_tool.SetVertexColor(i, biome.ground_color * color_factor);
            }
            mesh_tool.SetVertex(i, vertex);
        }

        /*if (base_tree_mesh == null && ResourceLoader.Exists("res://assets/tree.obj"))
         * {
         *      base_tree_mesh = ResourceLoader.Load<Mesh>("res://assets/tree.obj");
         * }
         * if (base_tree_material == null && ResourceLoader.Exists("res://assets/tree.tres"))
         * {
         *      Console.WriteLine("OK");
         *      base_tree_material = ResourceLoader.Load<SpatialMaterial>("res://assets/tree.tres");
         * }
         *
         * MultiMesh trees = new MultiMesh();
         * trees.Mesh = base_tree_mesh;
         * trees.TransformFormat = MultiMesh.TransformFormatEnum.Transform3d;
         *
         * if ((int)position.x == 0)
         * {
         *      var points1 = Utility.UniformPoissonDiskSampler.SampleRectangle(-new Vector2(size, size) / 2, new Vector2(-5, size / 2.0f), biome.tree_spacing);
         *      var points2 = Utility.UniformPoissonDiskSampler.SampleRectangle(new Vector2(5, 0), new Vector2(size, size) / 2, biome.tree_spacing);
         *      trees.InstanceCount = points1.Count + points2.Count;
         *
         *      int i = 0;
         *      foreach (var p in points1)
         *      {
         *              trees.SetInstanceTransform(i, Transform.Identity.Scaled(new Vector3(1, biome.tree_size, 1)).Translated(new Vector3(p.x, height_noise.GetNoise2dv(position + p) * 20, p.y)));
         ++i;
         *      }
         *
         *      foreach (var p in points2)
         *      {
         *              trees.SetInstanceTransform(i, Transform.Identity.Scaled(new Vector3(1, biome.tree_size, 1)).Translated(new Vector3(p.x, height_noise.GetNoise2dv(position + p) * 20, p.y)));
         ++i;
         *      }
         * }
         * else
         * {
         *      var points = Utility.UniformPoissonDiskSampler.SampleRectangle(-new Vector2(size, size) / 2, new Vector2(size, size) / 2, biome.tree_spacing);
         *      trees.InstanceCount = points.Count;
         *      int i = 0;
         *      foreach (var p in points)
         *      {
         *              trees.SetInstanceTransform(i, Transform.Identity.Scaled(new Vector3(1, biome.tree_size, 1)).Translated(new Vector3(p.x, height_noise.GetNoise2dv(position + p) * 20, p.y)));
         ++i;
         *      }
         * }
         *
         * MultiMeshInstance child = new MultiMeshInstance();
         * child.Multimesh = trees;
         * child.MaterialOverride = base_tree_material;
         * AddChild(child);*/

        var array = new ArrayMesh();

        mesh_tool.CommitToSurface(array);
        Mesh = array;

        if (base_shader == null && ResourceLoader.Exists("res://assets/chunk_shader.tres"))
        {
            base_shader = ResourceLoader.Load <ShaderMaterial>("res://assets/chunk_shader.tres");
        }
        var shader = base_shader;

        MaterialOverride = shader;
    }