Esempio n. 1
0
        // moveTerrainLayerDown
        public void moveTerrainLayerDown(MaterialGroupLayer parent, MaterialLayer layer)
        {
            Debug.Assert(parent.layers.Contains(layer));

            // Store current layer index
            int index = parent.layers.IndexOf(layer);

            // Remove layer from parent list
            parent.layers.Remove(layer);

            // Insert at the position after its last position
            parent.layers.Insert(index + 1, layer);
        }
Esempio n. 2
0
        // recursiveBuildNode
        private LayerNode recursiveBuildNode(MaterialLayer layer)
        {
            LayerNode node = new LayerNode(layer, layer.enabled);

            if (layer.type == "root" || layer.type == "group")
            {
                MaterialGroupLayer groupLayer = layer as MaterialGroupLayer;
                foreach (MaterialLayer childLayer in groupLayer.layers)
                {
                    node.Nodes.Add(recursiveBuildNode(childLayer));
                }
            }
            return(node);
        }
Esempio n. 3
0
        // populate tree view
        public void populateTreeView(MaterialGroupLayer rootLayer)
        {
            SuspendLayout();

            // Clear existing nodes
            layersTreeView.Nodes.Clear();

            // Build nodes
            LayerNode rootNode = recursiveBuildNode(rootLayer);

            // Set tree view to root node
            layersTreeView.Nodes.Add(rootNode);

            // Expand all
            layersTreeView.ExpandAll();

            ResumeLayout();
        }
Esempio n. 4
0
        // Move layer down
        private void downButton_Click(object sender, EventArgs e)
        {
            Debug.Assert(layersTreeView.SelectedNode is LayerNode);
            LayerNode node = layersTreeView.SelectedNode as LayerNode;

            // Move layer down
            MaterialGroupLayer parent = (node.Parent as LayerNode).layer as MaterialGroupLayer;

            _controller.moveTerrainLayerDown(parent, node.layer);

            // Refresh tree view
            populateTreeView(selectedMaterial.rootLayer);

            // Select repositioned layer
            selectLayer(node.layer);

            // Set changes made
            _controller.setChangesMade(true);
        }
Esempio n. 5
0
        // Remove layer button clicked
        private void removeLayerButton_Click(object sender, EventArgs e)
        {
            Debug.Assert(layersTreeView.SelectedNode is LayerNode);
            LayerNode node = layersTreeView.SelectedNode as LayerNode;

            Debug.Assert(node.layer.type != "root");

            // Display a warning that child nodes will be destroyed
            bool doRemove = false;

            if (node.layer.type == "group")
            {
                doRemove = MessageBox.Show("Are you sure you want to remove this node and all its child nodes?", "Remove Nodes", MessageBoxButtons.YesNo) == DialogResult.Yes;
            }
            else
            {
                doRemove = true;
            }

            if (doRemove)
            {
                // Remove layer
                MaterialGroupLayer parent = (node.Parent as LayerNode).layer as MaterialGroupLayer;
                _controller.removeTerrainLayer(parent, node.layer);

                // Refresh tree view
                populateTreeView(selectedMaterial.rootLayer);

                // Select different layer
                if (parent.layers.Count > 0)
                {
                    selectLayer(parent.layers[parent.layers.Count - 1]);
                }
                else
                {
                    selectLayer(parent);
                }

                // Set changes made
                _controller.setChangesMade(true);
            }
        }
Esempio n. 6
0
 // removeTerrainLayer
 public void removeTerrainLayer(MaterialGroupLayer parent, MaterialLayer layer)
 {
     parent.layers.Remove(layer);
 }
Esempio n. 7
0
 // addTerrainLayer
 public void addTerrainLayer(MaterialGroupLayer parent, MaterialLayer layer, int index)
 {
     parent.layers.Insert(index, layer);
 }
Esempio n. 8
0
        // recursiveRenderLayers
        private Texture2D recursiveRenderLayers(Texture2D current, List <Vector2> polygonPoints, float growthFactor, MaterialLayer layer)
        {
            // Stop rendering at disabled layers
            if (!layer.enabled)
            {
                return(current);
            }

            switch (layer.type)
            {
            case "root":
                // Render child layers without doing anything else
                MaterialGroupLayer rootLayer = layer as MaterialGroupLayer;
                foreach (MaterialLayer childLayer in rootLayer.layers)
                {
                    current = recursiveRenderLayers(current, polygonPoints, growthFactor, childLayer);
                }
                current = texturePass(current, current, LayerBlendType.Opaque, 1f, rootLayer.multiplier, rootLayer.baseColor);
                break;

            case "group":
                // Render child layers, and do a texture pass at the end
                MaterialGroupLayer groupLayer  = layer as MaterialGroupLayer;
                Texture2D          groupCanvas = createCanvas(current.Width, current.Height);
                foreach (MaterialLayer childLayer in groupLayer.layers)
                {
                    groupCanvas = recursiveRenderLayers(groupCanvas, polygonPoints, growthFactor, childLayer);
                }
                current = texturePass(current, groupCanvas, groupLayer.blendType, 1f, groupLayer.multiplier, groupLayer.baseColor);
                break;

            case "texture":
                MaterialTextureLayer textureLayer = layer as MaterialTextureLayer;
                current = texturePass(
                    current,
                    ResourceManager.getTexture(textureLayer.textureUID),
                    textureLayer.blendType,
                    textureLayer.scale,
                    textureLayer.multiplier,
                    textureLayer.baseColor);
                break;

            case "perlin":
                MaterialPerlinLayer perlinLayer     = layer as MaterialPerlinLayer;
                Texture2D           perlinTemporary = perlinPass(
                    current,
                    perlinLayer.seed,
                    perlinLayer.position,
                    perlinLayer.scale,
                    perlinLayer.frequency,
                    perlinLayer.gain,
                    perlinLayer.lacunarity,
                    perlinLayer.multiplier,
                    perlinLayer.fbmOffset,
                    perlinLayer.colorLow,
                    perlinLayer.colorHigh,
                    perlinLayer.iterations,
                    perlinLayer.invert);

                // TODO: Move this code inside perlinPass?
                if (perlinLayer.blendType == LayerBlendType.Overlay)
                {
                    current = texturePass(current, perlinTemporary, LayerBlendType.Overlay, 1f, 1f, Color.White);
                }
                else if (perlinLayer.blendType == LayerBlendType.Additive)
                {
                    current = texturePass(current, perlinTemporary, LayerBlendType.Additive, 1f, 1f, Color.White);
                }
                else
                {
                    current = perlinTemporary;
                }

                break;

            case "worley":
                MaterialWorleyLayer worleyLayer     = layer as MaterialWorleyLayer;
                Texture2D           worleyTemporary = worleyPass(
                    current,
                    worleyLayer.seed,
                    worleyLayer.position,
                    worleyLayer.scale,
                    worleyLayer.frequency,
                    worleyLayer.gain,
                    worleyLayer.lacunarity,
                    worleyLayer.multiplier,
                    worleyLayer.fbmOffset,
                    worleyLayer.colorLow,
                    worleyLayer.colorHigh,
                    worleyLayer.iterations,
                    worleyLayer.worleyFeature,
                    worleyLayer.invert);

                // TODO: Move this code inside worleyPass?
                if (worleyLayer.blendType == LayerBlendType.Overlay)
                {
                    current = texturePass(current, worleyTemporary, LayerBlendType.Overlay, 1f, 1f, Color.White);
                }
                else if (worleyLayer.blendType == LayerBlendType.Additive)
                {
                    current = texturePass(current, worleyTemporary, LayerBlendType.Additive, 1f, 1f, Color.White);
                }
                else
                {
                    current = worleyTemporary;
                }

                break;

            case "uniform_scatter":
                MaterialUniformScatterLayer uniformLayer = layer as MaterialUniformScatterLayer;
                current = uniformScatterPass(
                    current,
                    uniformLayer.textureUIDs,
                    uniformLayer.horizontalSpacing,
                    uniformLayer.verticalSpacing,
                    uniformLayer.jitter,
                    uniformLayer.baseColor,
                    uniformLayer.randomRed,
                    uniformLayer.randomGreen,
                    uniformLayer.randomBlue,
                    uniformLayer.randomAlpha);
                break;

            case "radial_scatter":
                MaterialRadialScatterLayer radialLayer = layer as MaterialRadialScatterLayer;
                current = radialScatterPass(
                    current,
                    growthFactor,
                    radialLayer.textureUIDs,
                    radialLayer.scaleWithGrowthFactor,
                    radialLayer.a,
                    radialLayer.b,
                    radialLayer.intersections,
                    radialLayer.maxRadius,
                    radialLayer.arms,
                    radialLayer.twinArms,
                    radialLayer.flipArms,
                    radialLayer.useAbsoluteTextureAngle,
                    radialLayer.absoluteTextureAngle,
                    radialLayer.relativeTextureAngle,
                    radialLayer.textureAngleJitter,
                    radialLayer.jitter,
                    radialLayer.centerJitter,
                    radialLayer.centerOffset,
                    radialLayer.baseColor,
                    radialLayer.minTextureSize,
                    radialLayer.maxTextureSize,
                    radialLayer.randomRed,
                    radialLayer.randomGreen,
                    radialLayer.randomBlue,
                    radialLayer.randomAlpha);
                break;

            case "edge_scatter":
                MaterialEdgeScatterLayer edgeLayer = layer as MaterialEdgeScatterLayer;
                current = edgeScatterPass(
                    current,
                    polygonPoints,
                    edgeLayer.textureUIDs,
                    edgeLayer.direction,
                    edgeLayer.threshold,
                    edgeLayer.hardCutoff,
                    edgeLayer.spacing,
                    edgeLayer.useAbsoluteAngle,
                    edgeLayer.absoluteAngle,
                    edgeLayer.relativeAngle,
                    edgeLayer.angleJitter,
                    edgeLayer.jitter,
                    edgeLayer.scale,
                    edgeLayer.scaleJitter,
                    edgeLayer.baseColor,
                    edgeLayer.randomRed,
                    edgeLayer.randomGreen,
                    edgeLayer.randomBlue,
                    edgeLayer.randomAlpha);
                break;

            case "leaves":
                MaterialLeavesLayer leavesLayer = layer as MaterialLeavesLayer;
                current = leavesPass(current, growthFactor, leavesLayer.textureUIDs, leavesLayer.baseColor);
                break;
            }

            return(current);
        }