Exemplo n.º 1
0
 public ColorGradient(Color color)
 {
     gradient = GradientUtils.CreateGradient(color);
 }
    void PopulateMatrices(List <HeatPoint> map)
    {
        if (map == null)
        {
            return;
        }

        m_Properties = new List <MaterialPropertyBlock>();
        m_Matrices   = new List <Matrix4x4[]>();
        Vector3          scale  = Vector3.one;
        List <Vector4[]> colors = new List <Vector4[]>();

        int index = 0;

        for (int a = 0; a < map.Count; a++)
        {
            int mod = a % k_ShapesPerDraw;
            if (mod == 0)
            {
                m_Properties.Add(new MaterialPropertyBlock());
                m_Matrices.Add(new Matrix4x4[k_ShapesPerDraw]);
                colors.Add(new Vector4[k_ShapesPerDraw]);
            }

            Matrix4x4  matrix     = Matrix4x4.identity;
            HeatPoint  pt         = map[a];
            Quaternion quaternion = Quaternion.Euler(pt.rotation);
            matrix.SetTRS(pt.position, quaternion, scale);
            m_Matrices[index][mod] = matrix;

            float pct = (pt.density / m_MaxDensity);
            colors[index][mod] = GradientUtils.PickGradientColor(m_Gradient, pct);

            if (a + 1 % k_ShapesPerDraw == 0)
            {
                index++;
            }
        }

        for (int a = 0; a < m_Properties.Count; a++)
        {
            if (colors[a] != null && colors[a].Length > 0)
            {
                m_Properties[a].SetVectorArray(m_ColorID, colors[a]);
            }
            index++;
        }

//        gameObject.GetComponent<Renderer>().materials = materials;
//        gameObject.GetComponent<HeatmapSubmap>().m_PointData = map;
//        gameObject.GetComponent<HeatmapSubmap>().m_TrianglesPerShape = RenderShapeUtils.GetTrianglesForShape(m_RenderStyle);
//
//        if (m_Tips)
//        {
//            if (gameObject.GetComponent<MeshCollider>() == null)
//            {
//                gameObject.AddComponent<MeshCollider>();
//            }
//
//            go.GetComponent<MeshCollider>().sharedMesh = mesh;
//        }
    }
Exemplo n.º 3
0
        private void BuildWater(Rule rule, TerrainMeshData meshData, MeshCell cell, RenderMode renderMode)
        {
            var meshRegion = cell.Water;

            if (meshRegion.Mesh == null)
            {
                return;
            }

            float colorNoiseFreq = renderMode == RenderMode.Scene
                ? rule.GetWaterLayerColorNoiseFreq() : 0;
            float eleNoiseFreq = rule.GetWaterLayerEleNoiseFreq();

            var meshTriangles = meshData.Triangles;

            var bottomGradient          = rule.GetBackgroundLayerGradient(_customizationService);
            var waterSurfaceGradient    = rule.GetWaterLayerGradient(_customizationService);
            var waterBottomLevelOffset  = rule.GetWaterLayerBottomLevel();
            var waterSurfaceLevelOffset = rule.GetWaterLayerSurfaceLevel();

            var elevationOffset = waterBottomLevelOffset - waterSurfaceLevelOffset;
            var surfaceOffset   = renderMode == RenderMode.Scene ? -waterBottomLevelOffset : 0;

            // NOTE: substitute gradient in overview mode
            if (renderMode == RenderMode.Overview)
            {
                bottomGradient = waterSurfaceGradient;
            }

            int index          = 0;
            var vertexCount    = meshRegion.Mesh.Triangles.Count * 3;
            var waterVertices  = new Vector3[vertexCount];
            var waterTriangles = new int[vertexCount];
            var waterColors    = new Color[vertexCount];

            foreach (var triangle in meshRegion.Mesh.Triangles)
            {
                // bottom surface
                AddTriangle(rule, meshData, triangle, bottomGradient, eleNoiseFreq, colorNoiseFreq, surfaceOffset);

                // NOTE: build offset shape only in case of Scene mode
                if (renderMode == RenderMode.Overview)
                {
                    continue;
                }

                var meshTriangle = meshTriangles[meshTriangles.Count - 1];

                var p0 = meshTriangle.Vertex0;
                var p1 = meshTriangle.Vertex1;
                var p2 = meshTriangle.Vertex2;

                // reuse just added vertices
                waterVertices[index]     = new Vector3(p0.x, p0.y + elevationOffset, p0.z);
                waterVertices[index + 1] = new Vector3(p1.x, p1.y + elevationOffset, p1.z);
                waterVertices[index + 2] = new Vector3(p2.x, p2.y + elevationOffset, p2.z);

                var color = GradientUtils.GetColor(waterSurfaceGradient, waterVertices[index], colorNoiseFreq);
                waterColors[index]     = color;
                waterColors[index + 1] = color;
                waterColors[index + 2] = color;

                waterTriangles[index]     = index;
                waterTriangles[index + 1] = index + 2;
                waterTriangles[index + 2] = index + 1;
                index += 3;
            }

            // finalizing offset shape
            if (renderMode == RenderMode.Scene)
            {
                BuildOffsetShape(meshData, meshRegion, rule.GetBackgroundLayerGradient(_customizationService),
                                 cell.Rectangle, colorNoiseFreq, waterBottomLevelOffset);

                Observable.Start(() => BuildWaterObject(rule, meshData,
                                                        waterVertices, waterTriangles, waterColors), Scheduler.MainThread);
            }
        }
Exemplo n.º 4
0
 public override void SetMaterialDirty()
 {
     base.SetMaterialDirty();
     m_GeneratedTexture = GradientUtils.CreateTexture(m_Gradient, (int)rectTransform.rect.width, (int)rectTransform.rect.height, m_Invert);
 }