예제 #1
0
    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;
        }
    }
예제 #2
0
    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;
        }
    }