public void GetDensities(Vector3 offset, out float[] densities, out Vector3[] colors) { int kernelHandle = shader.FindKernel("CSMain"); ComputeBuffer densitiesBuffer = new ComputeBuffer(40 * 40 * 40, sizeof(float) * 4); ComputeBuffer biomesBuffer = new ComputeBuffer(biomeGenerator.biomePoints.Length, sizeof(int) + sizeof(float) * 12); biomesBuffer.SetData(biomeGenerator.biomePoints); shader.SetBuffer(kernelHandle, "biomes", biomesBuffer); shader.SetBuffer(kernelHandle, "densities", densitiesBuffer); shader.SetFloat("xOff", offset.x); shader.SetFloat("yOff", offset.y); shader.SetFloat("zOff", offset.z); LoadSettingsToGPU(); shader.Dispatch(kernelHandle, 5, 5, 5); biomesBuffer.Dispose(); DensityPoint[] densityPoints = new DensityPoint[40 * 40 * 40]; densitiesBuffer.GetData(densityPoints); densitiesBuffer.Dispose(); densities = new float[40 * 40 * 40]; colors = new Vector3[40 * 40 * 40]; for (int i = 0; i < densityPoints.Length; i++) { densities[i] = densityPoints[i].density; colors[i] = densityPoints[i].color; } }
void OnSceneGUI(SceneView sv) { var e = Event.current; if (settings.densityPoints.Count <= 0) { settings.densityPoints.Add(new DensityPoint()); } DensityPoint last = default(DensityPoint); for (int i = 0; i < settings.densityPoints.Count; i++) { var dp = settings.densityPoints[i]; dp.position = Handles.PositionHandle(dp.position, Quaternion.identity); Handles.Label(dp.position, dp.position.ToString("F2")); settings.densityPoints[i] = dp; last = dp; } if (GUI.changed) { changed = true; changedTime = Time.time; } //draw normal preview: Vector3 normalDir = settings.GetNormal(normalTest.x, normalTest.y, normalTest.z); if (inst == GetHashCode()) { Handles.ArrowHandleCap(0, normalTest, Quaternion.LookRotation(normalDir), .1f, e.type); } normalTest = Handles.FreeMoveHandle(normalTest, Quaternion.identity, .02f, Vector3.zero, Handles.DotHandleCap); if (e.type == EventType.KeyDown && e.keyCode == KeyCode.N) { settings.densityPoints.Add(last); changed = true; changedTime = Time.time; e.Use(); } if (changed && Time.time - changedTime > delayedChangeTimeout) { Undo.RecordObject(this, "changed density point"); UpdatePreview(); Repaint(); changed = false; } if (Time.time - lastSaveTime > saveTimeout) { EditorUtility.SetDirty(this); AssetDatabase.SaveAssets(); lastSaveTime = Time.time; } }