public override bool Calculate() { LibNoise.ModuleBase noiseModule = null; var mnode = !Inputs[0].IsValueNull ? Inputs[0].GetValue <NodeModuleBase>() : null; if (mnode != null && mnode.DependenciesMet) { noiseModule = mnode.Module; } if (noiseModule != null) { if (_previewTexture == null) { _previewTexture = NodeModuleBase.GenerateDefaultTexture(_previewWidth, _previewHeight); } ++_nextSequenceId; int asyncId = _nextSequenceId; AsyncWorkQueue.QueueBackgroundWork(GetType().Name, () => { // expensive stuff LibNoise.Noise2D noise2d = new LibNoise.Noise2D(_previewWidth, _previewHeight, noiseModule); noise2d.GeneratePlanar(PreviewLeft, PreviewRight, PreviewTop, PreviewBottom, PreviewSeamless); // when we're done, queue the texture creation AsyncWorkQueue.QueueMainThreadWork(() => { if (asyncId >= _textureSequenceId) { _textureSequenceId = asyncId; _previewTexture = NodeModuleBase.CreateNoiseTexture(noise2d, Colorization); NodeEditorFramework.NodeEditor.RepaintClients(); } }); }); } else { _previewTexture = NodeModuleBase.GenerateDefaultTexture(_previewWidth, _previewHeight); } NodeEditorFramework.NodeEditor.RepaintClients(); return(true); }
public override bool Calculate() { LibNoise.ModuleBase noiseModule = null; var mnode = !Inputs[0].IsValueNull ? Inputs[0].GetValue <NodeModuleBase>() : null; if (mnode != null && mnode.DependenciesMet) { noiseModule = mnode.Module; } if (noiseModule != null) { if (_previewTexture == null) { _previewTexture = NodeModuleBase.GenerateDefaultTexture(_previewWidth, _previewHeight); } ++_nextSequenceId; int asyncId = _nextSequenceId; AsyncWorkQueue.QueueBackgroundWork(GetType().Name, () => { LibNoise.Noise2D noise2d = new LibNoise.Noise2D(_previewWidth, _previewHeight, noiseModule); noise2d.GeneratePlanar(PreviewLeft, PreviewRight, PreviewTop, PreviewBottom, PreviewSeamless); float[,] noiseData = noise2d.GetData(); bool[,] cellular = new bool[noiseData.GetLength(0), noiseData.GetLength(1)]; for (var x = 0; x < noiseData.GetLength(0); x++) { for (var y = 0; y < noiseData.GetLength(1); y++) { cellular[x, y] = noiseData[x, y] > Cutoff; } } bool[,] dstMap = new bool[noiseData.GetLength(0), noiseData.GetLength(1)]; for (int i = 0; i < SmoothIterations; ++i) { SmoothMap(cellular, dstMap); // swap the array references bool[,] tmp = cellular; cellular = dstMap; dstMap = tmp; } // when we're done, queue the texture creation AsyncWorkQueue.QueueMainThreadWork(() => { if (asyncId >= _textureSequenceId) { _textureSequenceId = asyncId; var pixels = new Color[cellular.GetLength(0) * cellular.GetLength(1)]; _previewTexture = new Texture2D(cellular.GetLength(0), cellular.GetLength(1)); _previewTexture.wrapMode = TextureWrapMode.Clamp; _previewTexture.alphaIsTransparency = true; for (var x = 0; x < noiseData.GetLength(0); x++) { for (var y = 0; y < noiseData.GetLength(1); y++) { pixels[x + y * noiseData.GetLength(0)] = cellular[x, y] ? Color.black : Color.white; } } _previewTexture.SetPixels(pixels); _previewTexture.Apply(); NodeEditorFramework.NodeEditor.RepaintClients(); } }); }); } else { _previewTexture = NodeModuleBase.GenerateDefaultTexture(_previewWidth, _previewHeight); } NodeEditorFramework.NodeEditor.RepaintClients(); return(true); }