// 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); }
// 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); }
// 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(); }
// 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); }
// 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); } }
// removeTerrainLayer public void removeTerrainLayer(MaterialGroupLayer parent, MaterialLayer layer) { parent.layers.Remove(layer); }
// addTerrainLayer public void addTerrainLayer(MaterialGroupLayer parent, MaterialLayer layer, int index) { parent.layers.Insert(index, layer); }
// 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); }