我们创建了 Fontainebleau 演示来说明摄影photogrammetry流程和 LayeredLit 着色器的使用。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

212 行
7.9 KiB

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
namespace JBooth.VertexPainterPro
{
public class BakePivot : IVertexPainterUtility
{
public string GetName()
{
return "Bake Pivot/Rotation";
}
public void OnGUI(PaintJob[] jobs)
{
pivotTarget = (PivotTarget)EditorGUILayout.EnumPopup("Store in", pivotTarget);
bakePivotUseLocal = EditorGUILayout.Toggle("Use Local Space", bakePivotUseLocal);
EditorGUILayout.BeginHorizontal();
EditorGUILayout.Space();
if (GUILayout.Button("Bake Pivot"))
{
DoBakePivot(jobs);
}
if (GUILayout.Button("Bake Rotation"))
{
DoBakeRotation(jobs);
}
EditorGUILayout.Space();
EditorGUILayout.EndHorizontal();
}
enum PivotTarget
{
UV0,
UV1,
UV2,
UV3
}
public enum BakeChannel
{
None,
Color,
UV0,
UV1,
UV2,
UV3
}
PivotTarget pivotTarget = PivotTarget.UV2;
bool bakePivotUseLocal = true;
void InitBakeChannel(BakeChannel bc, PaintJob[] jobs)
{
foreach (PaintJob job in jobs)
{
if (bc == BakeChannel.Color)
{
if (job.stream.colors == null || job.stream.colors.Length != job.verts.Length)
{
job.stream.SetColor(Color.black, job.verts.Length);
}
}
else if (bc == BakeChannel.UV0)
{
if (job.stream.uv0 == null || job.stream.uv0.Count!= job.verts.Length)
{
job.stream.SetUV0(Vector4.zero, job.verts.Length);
}
}
else if (bc == BakeChannel.UV1)
{
if (job.stream.uv1 == null || job.stream.uv1.Count != job.verts.Length)
{
job.stream.SetUV1(Vector4.zero, job.verts.Length);
}
}
else if (bc == BakeChannel.UV2)
{
if (job.stream.uv2 == null || job.stream.uv2.Count != job.verts.Length)
{
job.stream.SetUV2(Vector4.zero, job.verts.Length);
}
}
else if (bc == BakeChannel.UV3)
{
if (job.stream.uv3 == null || job.stream.uv3.Count != job.verts.Length)
{
job.stream.SetUV3(Vector4.zero, job.verts.Length);
}
}
EditorUtility.SetDirty(job.stream);
EditorUtility.SetDirty(job.stream.gameObject);
}
}
void DoBakeRotation(PaintJob[] jobs)
{
switch (pivotTarget)
{
case PivotTarget.UV0:
{
InitBakeChannel(BakeChannel.UV0, jobs);
foreach (PaintJob job in jobs)
{
Vector3 lp = bakePivotUseLocal ? job.meshFilter.transform.localRotation.eulerAngles : job.meshFilter.transform.rotation.eulerAngles;
job.stream.SetUV0(new Vector4(lp.x, lp.y, lp.z, UnityEngine.Random.Range(0.0f, 1.0f)), job.verts.Length);
EditorUtility.SetDirty(job.stream);
EditorUtility.SetDirty(job.stream.gameObject);
}
break;
}
case PivotTarget.UV1:
{
InitBakeChannel(BakeChannel.UV1, jobs);
foreach (PaintJob job in jobs)
{
Vector3 lp = bakePivotUseLocal ? job.meshFilter.transform.localRotation.eulerAngles : job.meshFilter.transform.rotation.eulerAngles;
job.stream.SetUV1(new Vector4(lp.x, lp.y, lp.z, UnityEngine.Random.Range(0.0f, 1.0f)), job.verts.Length);
EditorUtility.SetDirty(job.stream);
EditorUtility.SetDirty(job.stream.gameObject);
}
break;
}
case PivotTarget.UV2:
{
InitBakeChannel(BakeChannel.UV2, jobs);
foreach (PaintJob job in jobs)
{
Vector3 lp = bakePivotUseLocal ? job.meshFilter.transform.localRotation.eulerAngles : job.meshFilter.transform.rotation.eulerAngles;
job.stream.SetUV2(new Vector4(lp.x, lp.y, lp.z, UnityEngine.Random.Range(0.0f, 1.0f)), job.verts.Length);
EditorUtility.SetDirty(job.stream);
EditorUtility.SetDirty(job.stream.gameObject);
}
break;
}
case PivotTarget.UV3:
{
InitBakeChannel(BakeChannel.UV3, jobs);
foreach (PaintJob job in jobs)
{
Vector3 lp = bakePivotUseLocal ? job.meshFilter.transform.localRotation.eulerAngles : job.meshFilter.transform.rotation.eulerAngles;
job.stream.SetUV3(new Vector4(lp.x, lp.y, lp.z, UnityEngine.Random.Range(0.0f, 1.0f)), job.verts.Length);
EditorUtility.SetDirty(job.stream);
EditorUtility.SetDirty(job.stream.gameObject);
}
break;
}
}
}
void DoBakePivot(PaintJob[] jobs)
{
switch (pivotTarget)
{
case PivotTarget.UV0:
{
InitBakeChannel(BakeChannel.UV0, jobs);
foreach (PaintJob job in jobs)
{
Vector3 lp = bakePivotUseLocal ? job.meshFilter.transform.localPosition : job.meshFilter.transform.position;
job.stream.SetUV0(new Vector4(lp.x, lp.y, lp.z, UnityEngine.Random.Range(0.0f, 1.0f)), job.verts.Length);
EditorUtility.SetDirty(job.stream);
EditorUtility.SetDirty(job.stream.gameObject);
}
break;
}
case PivotTarget.UV1:
{
InitBakeChannel(BakeChannel.UV1, jobs);
foreach (PaintJob job in jobs)
{
Vector3 lp = bakePivotUseLocal ? job.meshFilter.transform.localPosition : job.meshFilter.transform.position;
job.stream.SetUV1(new Vector4(lp.x, lp.y, lp.z, UnityEngine.Random.Range(0.0f, 1.0f)), job.verts.Length);
EditorUtility.SetDirty(job.stream);
EditorUtility.SetDirty(job.stream.gameObject);
}
break;
}
case PivotTarget.UV2:
{
InitBakeChannel(BakeChannel.UV2, jobs);
foreach (PaintJob job in jobs)
{
Vector3 lp = bakePivotUseLocal ? job.meshFilter.transform.localPosition : job.meshFilter.transform.position;
job.stream.SetUV2(new Vector4(lp.x, lp.y, lp.z, UnityEngine.Random.Range(0.0f, 1.0f)), job.verts.Length);
EditorUtility.SetDirty(job.stream);
EditorUtility.SetDirty(job.stream.gameObject);
}
break;
}
case PivotTarget.UV3:
{
InitBakeChannel(BakeChannel.UV3, jobs);
foreach (PaintJob job in jobs)
{
Vector3 lp = bakePivotUseLocal ? job.meshFilter.transform.localPosition : job.meshFilter.transform.position;
job.stream.SetUV3(new Vector4(lp.x, lp.y, lp.z, UnityEngine.Random.Range(0.0f, 1.0f)), job.verts.Length);
EditorUtility.SetDirty(job.stream);
EditorUtility.SetDirty(job.stream.gameObject);
}
break;
}
}
}
}
}