public void Generate(RenderTexture targetRt)
        {
            GHeightMapFromMeshGeneratorParams param = GTextureToolParams.Instance.HeightMapFromMesh;

            if (param.SrcMesh == null)
            {
                GCommon.FillTexture(targetRt, Color.black);
            }
            else
            {
                try
                {
                    SetUp(param, targetRt);
                    Render(param, targetRt);
                }
                catch (System.Exception e)
                {
                    Debug.Log(e);
                }
                finally
                {
                    CleanUp();
                }
            }
        }
        private void SetUp(GHeightMapFromMeshGeneratorParams param, RenderTexture targetRt)
        {
            GameObject camGo = new GameObject("~HeightMapFromMeshCamera");

            camGo.transform.position   = -Vector3.one * 5000;
            camGo.transform.rotation   = Quaternion.Euler(90, 0, 0);
            camGo.transform.localScale = Vector3.one;

            camera = camGo.AddComponent <Camera>();
            camera.orthographic     = true;
            camera.enabled          = false;
            camera.clearFlags       = CameraClearFlags.SolidColor;
            camera.backgroundColor  = Color.clear;
            camera.nearClipPlane    = 0;
            camera.farClipPlane     = param.ProjectionDepth;
            camera.orthographicSize = DEFAULT_CAMERA_ORTHO_SIZE;
            camera.aspect           = 1;
            camera.targetTexture    = targetRt;

            gameObject = new GameObject("~HeightMapFromMeshGameObjectPivot");
            gameObject.transform.position   = camGo.transform.position + param.Offset;
            gameObject.transform.rotation   = param.Rotation;
            gameObject.transform.localScale = param.Scale;

            GameObject model = new GameObject("~Model");

            GUtilities.ResetTransform(model.transform, gameObject.transform);
            model.transform.localPosition = -param.SrcMesh.bounds.center;

            MeshFilter mf = model.AddComponent <MeshFilter>();

            mf.sharedMesh = param.SrcMesh;

            MeshRenderer mr = model.AddComponent <MeshRenderer>();

            mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
            mr.receiveShadows    = false;
            mr.sharedMaterials   = new Material[] { GInternalMaterials.HeightMapFromMeshMaterial };
        }
        private void DrawHeightMapFromMeshParams()
        {
            GHeightMapFromMeshGeneratorParams param = GTextureToolParams.Instance.HeightMapFromMesh;

            bool isSrcMeshChanged = false;

            EditorGUI.BeginChangeCheck();
            param.SrcMesh = EditorGUILayout.ObjectField("Mesh", param.SrcMesh, typeof(Mesh), false) as Mesh;
            if (EditorGUI.EndChangeCheck())
            {
                isSrcMeshChanged = true;
            }

            GUI.enabled           = param.SrcMesh != null;
            param.Offset          = GEditorCommon.InlineVector3Field("Offset", param.Offset);
            param.Rotation        = Quaternion.Euler(GEditorCommon.InlineVector3Field("Rotation", param.Rotation.eulerAngles));
            param.Scale           = GEditorCommon.InlineVector3Field("Scale", param.Scale);
            param.ProjectionDepth = EditorGUILayout.FloatField("Depth", param.ProjectionDepth);
            EditorGUILayout.LabelField("Camera", "Top Down", GEditorCommon.WordWrapItalicLabel);

            if (GUILayout.Button("Fit Camera") || isSrcMeshChanged)
            {
                Bounds bounds = param.SrcMesh.bounds;
                param.Rotation = Quaternion.identity;
                param.Scale    = Vector3.one * GHeightMapFromMeshGenerator.DEFAULT_CAMERA_ORTHO_SIZE * 2f / (Mathf.Max(bounds.size.x, bounds.size.z) + 0.0001f);
                Matrix4x4 scaleMatrix = Matrix4x4.Scale(param.Scale);
                param.Offset          = scaleMatrix.MultiplyPoint(new Vector3(0, -bounds.size.y * 0.5f, 0));
                param.ProjectionDepth = scaleMatrix.MultiplyPoint(new Vector3(0, bounds.size.y, 0)).y;
                RenderPreviewTexture();
            }
            GUI.enabled = true;

            lockLivePreviewTerrain = false;

            GTextureToolParams.Instance.HeightMapFromMesh = param;
        }
 private void Render(GHeightMapFromMeshGeneratorParams param, RenderTexture targetRt)
 {
     camera.targetTexture = targetRt;
     camera.Render();
 }