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(); }