add texture editor.
This commit is contained in:
@@ -0,0 +1,118 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace uDesktopDuplication
|
||||||
|
{
|
||||||
|
|
||||||
|
[CustomEditor(typeof(Texture))]
|
||||||
|
public class TextureEditor : Editor
|
||||||
|
{
|
||||||
|
Texture texture
|
||||||
|
{
|
||||||
|
get { return target as Texture; }
|
||||||
|
}
|
||||||
|
|
||||||
|
Monitor monitor
|
||||||
|
{
|
||||||
|
get { return texture.monitor; }
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isAvailable
|
||||||
|
{
|
||||||
|
get { return monitor == null || !Application.isPlaying; }
|
||||||
|
}
|
||||||
|
|
||||||
|
bool basicsFolded_ = true;
|
||||||
|
bool invertFolded_ = true;
|
||||||
|
bool clipFolded_ = true;
|
||||||
|
bool matFolded_ = true;
|
||||||
|
|
||||||
|
SerializedProperty invertX_;
|
||||||
|
SerializedProperty invertY_;
|
||||||
|
SerializedProperty useClip_;
|
||||||
|
SerializedProperty clipPos_;
|
||||||
|
SerializedProperty clipScale_;
|
||||||
|
|
||||||
|
void OnEnable()
|
||||||
|
{
|
||||||
|
invertX_ = serializedObject.FindProperty("invertX_");
|
||||||
|
invertY_ = serializedObject.FindProperty("invertY_");
|
||||||
|
useClip_ = serializedObject.FindProperty("useClip_");
|
||||||
|
clipPos_ = serializedObject.FindProperty("clipPos");
|
||||||
|
clipScale_ = serializedObject.FindProperty("clipScale");
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnInspectorGUI()
|
||||||
|
{
|
||||||
|
serializedObject.Update();
|
||||||
|
|
||||||
|
EditorGUILayout.Space();
|
||||||
|
DrawMonitor();
|
||||||
|
DrawInvert();
|
||||||
|
DrawClip();
|
||||||
|
DrawMaterial();
|
||||||
|
|
||||||
|
serializedObject.ApplyModifiedProperties();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Fold(string name, ref bool folded, System.Action func)
|
||||||
|
{
|
||||||
|
folded = Utils.Foldout(name, folded);
|
||||||
|
if (folded) {
|
||||||
|
++EditorGUI.indentLevel;
|
||||||
|
func();
|
||||||
|
--EditorGUI.indentLevel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawMonitor()
|
||||||
|
{
|
||||||
|
Fold("Monitor", ref basicsFolded_, () => {
|
||||||
|
if (isAvailable) {
|
||||||
|
EditorGUILayout.HelpBox("Monitor information is available only in runtime.", MessageType.Info);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var id = EditorGUILayout.Popup("Monitor", monitor.id, Manager.monitors.Select(x => x.name).ToArray());
|
||||||
|
if (id != monitor.id) { texture.monitorId = id; }
|
||||||
|
EditorGUILayout.IntField("ID", monitor.id);
|
||||||
|
EditorGUILayout.Toggle("Is Primary", monitor.isPrimary);
|
||||||
|
EditorGUILayout.Vector2Field("Resolution", new Vector2(monitor.width, monitor.height));
|
||||||
|
EditorGUILayout.Vector2Field("DPI", new Vector2(monitor.dpiX, monitor.dpiY));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawInvert()
|
||||||
|
{
|
||||||
|
Fold("Invert", ref invertFolded_, () => {
|
||||||
|
texture.invertX = EditorGUILayout.Toggle("Invert X", invertX_.boolValue);
|
||||||
|
texture.invertY = EditorGUILayout.Toggle("Invert Y", invertY_.boolValue);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawClip()
|
||||||
|
{
|
||||||
|
Fold("Clip", ref clipFolded_, () => {
|
||||||
|
texture.useClip = EditorGUILayout.Toggle("Use Clip", useClip_.boolValue);
|
||||||
|
EditorGUILayout.PropertyField(clipPos_);
|
||||||
|
EditorGUILayout.PropertyField(clipScale_);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawMaterial()
|
||||||
|
{
|
||||||
|
Fold("Material", ref matFolded_, () => {
|
||||||
|
if (!Application.isPlaying) {
|
||||||
|
EditorGUILayout.HelpBox("These parameters are applied to the shared material when not playing.", MessageType.Info);
|
||||||
|
}
|
||||||
|
texture.meshForwardDirection = (Texture.MeshForwardDirection)EditorGUILayout.EnumPopup("Mesh Forward Direction", texture.meshForwardDirection);
|
||||||
|
texture.bend = EditorGUILayout.Toggle("Use Bend", texture.bend);
|
||||||
|
texture.width = EditorGUILayout.FloatField("Bend Width", texture.width);
|
||||||
|
texture.radius = EditorGUILayout.Slider("Bend Radius", texture.radius, texture.worldWidth / (2 * Mathf.PI), 100f);
|
||||||
|
texture.thickness = EditorGUILayout.Slider("Thickness", texture.thickness, 0f, 30f);
|
||||||
|
texture.culling = (Texture.Culling)EditorGUILayout.EnumPopup("Culling", texture.culling);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1202a4540abf0ad4781c025339772c4a
|
||||||
|
timeCreated: 1480758898
|
||||||
|
licenseType: Pro
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace uDesktopDuplication
|
||||||
|
{
|
||||||
|
|
||||||
|
public static class Utils
|
||||||
|
{
|
||||||
|
public static bool Foldout(string title, bool display)
|
||||||
|
{
|
||||||
|
var style = new GUIStyle("ShurikenModuleTitle");
|
||||||
|
style.font = new GUIStyle(EditorStyles.label).font;
|
||||||
|
style.border = new RectOffset(15, 7, 4, 4);
|
||||||
|
style.fixedHeight = 22;
|
||||||
|
style.contentOffset = new Vector2(20f, -2f);
|
||||||
|
|
||||||
|
var rect = GUILayoutUtility.GetRect(16f, 22f, style);
|
||||||
|
GUI.Box(rect, title, style);
|
||||||
|
|
||||||
|
var e = Event.current;
|
||||||
|
|
||||||
|
var toggleRect = new Rect(rect.x + 4f, rect.y + 2f, 13f, 13f);
|
||||||
|
if (e.type == EventType.Repaint) {
|
||||||
|
EditorStyles.foldout.Draw(toggleRect, false, false, display, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.type == EventType.MouseDown && rect.Contains(e.mousePosition)) {
|
||||||
|
display = !display;
|
||||||
|
e.Use();
|
||||||
|
}
|
||||||
|
|
||||||
|
return display;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ReadOnlyTextField(string label, string text)
|
||||||
|
{
|
||||||
|
EditorGUILayout.BeginHorizontal();
|
||||||
|
{
|
||||||
|
EditorGUILayout.LabelField(label, GUILayout.Width(EditorGUIUtility.labelWidth - 4));
|
||||||
|
EditorGUILayout.SelectableLabel(text, EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight));
|
||||||
|
}
|
||||||
|
EditorGUILayout.EndHorizontal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 278117152a6252546a219a17ef6f21f4
|
||||||
|
timeCreated: 1480759393
|
||||||
|
licenseType: Pro
|
||||||
|
MonoImporter:
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
Binary file not shown.
@@ -116,7 +116,7 @@ public class MultipleMonitorCreator : MonoBehaviour
|
|||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
// Create monitor obeject
|
// Create monitor obeject
|
||||||
var go = Instantiate(monitorPrefab);
|
var go = Instantiate(monitorPrefab);
|
||||||
go.name = "Monitor " + i;
|
go.name = uDesktopDuplication.Manager.monitors[i].name;
|
||||||
|
|
||||||
// Saved infomation
|
// Saved infomation
|
||||||
if (savedInfoList.Count == i) {
|
if (savedInfoList.Count == i) {
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -6,7 +6,7 @@ namespace uDesktopDuplication
|
|||||||
[AddComponentMenu("uDesktopDuplication/Texture")]
|
[AddComponentMenu("uDesktopDuplication/Texture")]
|
||||||
public class Texture : MonoBehaviour
|
public class Texture : MonoBehaviour
|
||||||
{
|
{
|
||||||
private Monitor monitor_;
|
Monitor monitor_;
|
||||||
public Monitor monitor
|
public Monitor monitor
|
||||||
{
|
{
|
||||||
get { return monitor_; }
|
get { return monitor_; }
|
||||||
@@ -14,33 +14,112 @@ public class Texture : MonoBehaviour
|
|||||||
{
|
{
|
||||||
monitor_ = value;
|
monitor_ = value;
|
||||||
if (monitor_ != null) {
|
if (monitor_ != null) {
|
||||||
material = GetComponent<Renderer>().material; // clone
|
|
||||||
material.mainTexture = monitor_.texture;
|
material.mainTexture = monitor_.texture;
|
||||||
material.SetFloat("_Width", transform.localScale.x);
|
width = transform.localScale.x;
|
||||||
|
rotation = monitor.rotation;
|
||||||
|
invertX = invertX_;
|
||||||
|
invertY = invertY_;
|
||||||
|
useClip = useClip_;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private int lastMonitorId_ = 0;
|
int lastMonitorId_ = 0;
|
||||||
public int monitorId
|
public int monitorId
|
||||||
{
|
{
|
||||||
get { return monitor.id; }
|
get { return monitor.id; }
|
||||||
set { monitor = Manager.GetMonitor(value); }
|
set { monitor = Manager.GetMonitor(value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
[Header("Invert UVs")]
|
[SerializeField] bool invertX_ = false;
|
||||||
public bool invertX = false;
|
public bool invertX
|
||||||
public bool invertY = false;
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return invertX_;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
invertX_ = value;
|
||||||
|
if (invertX_) {
|
||||||
|
material.EnableKeyword("INVERT_X");
|
||||||
|
} else {
|
||||||
|
material.DisableKeyword("INVERT_X");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Header("Clip")]
|
[SerializeField] bool invertY_ = false;
|
||||||
public bool useClip = false;
|
public bool invertY
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return invertY_;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
invertY_ = value;
|
||||||
|
if (invertY_) {
|
||||||
|
material.EnableKeyword("INVERT_Y");
|
||||||
|
} else {
|
||||||
|
material.DisableKeyword("INVERT_Y");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public MonitorRotation rotation
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return monitor.rotation;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
switch (value)
|
||||||
|
{
|
||||||
|
case MonitorRotation.Identity:
|
||||||
|
material.DisableKeyword("ROTATE90");
|
||||||
|
material.DisableKeyword("ROTATE180");
|
||||||
|
material.DisableKeyword("ROTATE270");
|
||||||
|
break;
|
||||||
|
case MonitorRotation.Rotate90:
|
||||||
|
material.EnableKeyword("ROTATE90");
|
||||||
|
material.DisableKeyword("ROTATE180");
|
||||||
|
material.DisableKeyword("ROTATE270");
|
||||||
|
break;
|
||||||
|
case MonitorRotation.Rotate180:
|
||||||
|
material.DisableKeyword("ROTATE90");
|
||||||
|
material.EnableKeyword("ROTATE180");
|
||||||
|
material.DisableKeyword("ROTATE270");
|
||||||
|
break;
|
||||||
|
case MonitorRotation.Rotate270:
|
||||||
|
material.DisableKeyword("ROTATE90");
|
||||||
|
material.DisableKeyword("ROTATE180");
|
||||||
|
material.EnableKeyword("ROTATE270");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[SerializeField] bool useClip_ = false;
|
||||||
public Vector2 clipPos = Vector2.zero;
|
public Vector2 clipPos = Vector2.zero;
|
||||||
public Vector2 clipScale = new Vector2(0.2f, 0.2f);
|
public Vector2 clipScale = new Vector2(0.2f, 0.2f);
|
||||||
|
public bool useClip
|
||||||
public enum MeshForwardDirection
|
|
||||||
{
|
{
|
||||||
Y = 0,
|
get
|
||||||
Z = 1,
|
{
|
||||||
|
return useClip_;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (useClip_) {
|
||||||
|
material.EnableKeyword("USE_CLIP");
|
||||||
|
} else {
|
||||||
|
material.DisableKeyword("USE_CLIP");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool bend
|
public bool bend
|
||||||
@@ -61,6 +140,11 @@ public class Texture : MonoBehaviour
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum MeshForwardDirection
|
||||||
|
{
|
||||||
|
Y = 0,
|
||||||
|
Z = 1,
|
||||||
|
}
|
||||||
public MeshForwardDirection meshForwardDirection
|
public MeshForwardDirection meshForwardDirection
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -84,6 +168,24 @@ public class Texture : MonoBehaviour
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum Culling
|
||||||
|
{
|
||||||
|
Off = 0,
|
||||||
|
Front = 1,
|
||||||
|
Back = 2,
|
||||||
|
}
|
||||||
|
public Culling culling
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return (Culling)material.GetInt("_Cull");
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
material.SetInt("_Cull", (int)value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public float radius
|
public float radius
|
||||||
{
|
{
|
||||||
get { return material.GetFloat("_Radius"); }
|
get { return material.GetFloat("_Radius"); }
|
||||||
@@ -102,10 +204,39 @@ public class Texture : MonoBehaviour
|
|||||||
set { material.SetFloat("_Thickness", value); }
|
set { material.SetFloat("_Thickness", value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Material material_;
|
||||||
public Material material
|
public Material material
|
||||||
{
|
{
|
||||||
get;
|
get
|
||||||
private set;
|
{
|
||||||
|
if (Application.isPlaying) {
|
||||||
|
return material_ ?? (material_ = GetComponent<Renderer>().material); // clone
|
||||||
|
} else {
|
||||||
|
return GetComponent<Renderer>().sharedMaterial;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Mesh mesh
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return GetComponent<MeshFilter>().sharedMesh;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public float worldWidth
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return transform.localScale.x * (mesh.bounds.extents.x * 2f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public float worldHeight
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return transform.localScale.y * (mesh.bounds.extents.y * 2f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnEnable()
|
void OnEnable()
|
||||||
@@ -124,7 +255,7 @@ public class Texture : MonoBehaviour
|
|||||||
void Update()
|
void Update()
|
||||||
{
|
{
|
||||||
KeepMonitor();
|
KeepMonitor();
|
||||||
monitor.shouldBeUpdated = true;
|
RequireUpdate();
|
||||||
UpdateMaterial();
|
UpdateMaterial();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,6 +268,11 @@ public class Texture : MonoBehaviour
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RequireUpdate()
|
||||||
|
{
|
||||||
|
monitor.shouldBeUpdated = true;
|
||||||
|
}
|
||||||
|
|
||||||
void Reinitialize()
|
void Reinitialize()
|
||||||
{
|
{
|
||||||
// Monitor instance is released here when initialized.
|
// Monitor instance is released here when initialized.
|
||||||
@@ -145,76 +281,17 @@ public class Texture : MonoBehaviour
|
|||||||
|
|
||||||
void UpdateMaterial()
|
void UpdateMaterial()
|
||||||
{
|
{
|
||||||
Invert();
|
width = transform.localScale.x;
|
||||||
Rotate();
|
rotation = monitor.rotation;
|
||||||
Clip();
|
material.SetVector("_ClipPositionScale", new Vector4(clipPos.x, clipPos.y, clipScale.x, clipScale.y));
|
||||||
}
|
|
||||||
|
|
||||||
void Invert()
|
|
||||||
{
|
|
||||||
if (invertX) {
|
|
||||||
material.EnableKeyword("INVERT_X");
|
|
||||||
} else {
|
|
||||||
material.DisableKeyword("INVERT_X");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (invertY) {
|
|
||||||
material.EnableKeyword("INVERT_Y");
|
|
||||||
} else {
|
|
||||||
material.DisableKeyword("INVERT_Y");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Rotate()
|
|
||||||
{
|
|
||||||
switch (monitor.rotation)
|
|
||||||
{
|
|
||||||
case MonitorRotation.Identity:
|
|
||||||
material.DisableKeyword("ROTATE90");
|
|
||||||
material.DisableKeyword("ROTATE180");
|
|
||||||
material.DisableKeyword("ROTATE270");
|
|
||||||
break;
|
|
||||||
case MonitorRotation.Rotate90:
|
|
||||||
material.EnableKeyword("ROTATE90");
|
|
||||||
material.DisableKeyword("ROTATE180");
|
|
||||||
material.DisableKeyword("ROTATE270");
|
|
||||||
break;
|
|
||||||
case MonitorRotation.Rotate180:
|
|
||||||
material.DisableKeyword("ROTATE90");
|
|
||||||
material.EnableKeyword("ROTATE180");
|
|
||||||
material.DisableKeyword("ROTATE270");
|
|
||||||
break;
|
|
||||||
case MonitorRotation.Rotate270:
|
|
||||||
material.DisableKeyword("ROTATE90");
|
|
||||||
material.DisableKeyword("ROTATE180");
|
|
||||||
material.EnableKeyword("ROTATE270");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Clip()
|
|
||||||
{
|
|
||||||
if (useClip) {
|
|
||||||
material.EnableKeyword("USE_CLIP");
|
|
||||||
material.SetVector("_ClipPositionScale", new Vector4(clipPos.x, clipPos.y, clipScale.x, clipScale.y));
|
|
||||||
} else {
|
|
||||||
material.DisableKeyword("USE_CLIP");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Vector3 GetWorldPositionFromCoord(int u, int v)
|
public Vector3 GetWorldPositionFromCoord(int u, int v)
|
||||||
{
|
{
|
||||||
// Mesh & Scale information
|
|
||||||
var mesh = GetComponent<MeshFilter>().sharedMesh;
|
|
||||||
var width = transform.localScale.x * (mesh.bounds.extents.x * 2f);
|
|
||||||
var height = transform.localScale.y * (mesh.bounds.extents.y * 2f);
|
|
||||||
|
|
||||||
// Local position (scale included).
|
// Local position (scale included).
|
||||||
var x = (float)(u - monitor.width / 2) / monitor.width;
|
var x = (float)(u - monitor.width / 2) / monitor.width;
|
||||||
var y = -(float)(v - monitor.height / 2) / monitor.height;
|
var y = -(float)(v - monitor.height / 2) / monitor.height;
|
||||||
var localPos = new Vector3(width * x, height * y, 0f);
|
var localPos = new Vector3(worldWidth * x, worldHeight * y, 0f);
|
||||||
|
|
||||||
// Bending
|
// Bending
|
||||||
if (bend) {
|
if (bend) {
|
||||||
|
|||||||
@@ -7,6 +7,11 @@ Properties
|
|||||||
_MainTex ("Albedo (RGB)", 2D) = "white" {}
|
_MainTex ("Albedo (RGB)", 2D) = "white" {}
|
||||||
_Glossiness ("Smoothness", Range(0, 1)) = 0.5
|
_Glossiness ("Smoothness", Range(0, 1)) = 0.5
|
||||||
_Metallic ("Metallic", Range(0, 1)) = 0.0
|
_Metallic ("Metallic", Range(0, 1)) = 0.0
|
||||||
|
[KeywordEnum(Y, Z)] _Forward("Mesh Forward Direction", Int) = 0
|
||||||
|
[Toggle(BEND_ON)] _Bend("Use Bend", Int) = 0
|
||||||
|
[PowerSlider(10.0)] _Radius("Bend Radius", Range(1, 100)) = 30
|
||||||
|
[PowerSlider(10.0)] _Thickness("Thickness", Range(0.01, 10)) = 1
|
||||||
|
_Width("Width", Range(0.0, 10.0)) = 1.0
|
||||||
[KeywordEnum(Off, Front, Back)] _Cull("Culling", Int) = 2
|
[KeywordEnum(Off, Front, Back)] _Cull("Culling", Int) = 2
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -19,18 +24,27 @@ SubShader
|
|||||||
CGPROGRAM
|
CGPROGRAM
|
||||||
|
|
||||||
#pragma target 3.0
|
#pragma target 3.0
|
||||||
#pragma surface surf Standard fullforwardshadows
|
#pragma surface surf Standard fullforwardshadows vertex:vert
|
||||||
#pragma multi_compile ___ INVERT_X
|
#pragma multi_compile ___ INVERT_X
|
||||||
#pragma multi_compile ___ INVERT_Y
|
#pragma multi_compile ___ INVERT_Y
|
||||||
#pragma multi_compile ___ ROTATE90 ROTATE180 ROTATE270
|
#pragma multi_compile ___ ROTATE90 ROTATE180 ROTATE270
|
||||||
#pragma multi_compile ___ USE_BEND
|
|
||||||
#pragma multi_compile ___ USE_CLIP
|
#pragma multi_compile ___ USE_CLIP
|
||||||
|
#pragma multi_compile ___ BEND_ON
|
||||||
|
#pragma multi_compile _FORWARD_Y _FORWARD_Z
|
||||||
|
|
||||||
#define SURFACE_SHADER
|
#define SURFACE_SHADER
|
||||||
#include "./uDD_Common.cginc"
|
#include "./uDD_Common.cginc"
|
||||||
|
|
||||||
half _Glossiness;
|
half _Glossiness;
|
||||||
half _Metallic;
|
half _Metallic;
|
||||||
|
half _Radius;
|
||||||
|
half _Width;
|
||||||
|
half _Thickness;
|
||||||
|
|
||||||
|
void vert(inout appdata_full v)
|
||||||
|
{
|
||||||
|
uddBendVertex(v.vertex.xyz, _Radius, _Width, _Thickness);
|
||||||
|
}
|
||||||
|
|
||||||
void surf(Input IN, inout SurfaceOutputStandard o)
|
void surf(Input IN, inout SurfaceOutputStandard o)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -58,9 +58,9 @@ Pass
|
|||||||
#pragma multi_compile ___ INVERT_X
|
#pragma multi_compile ___ INVERT_X
|
||||||
#pragma multi_compile ___ INVERT_Y
|
#pragma multi_compile ___ INVERT_Y
|
||||||
#pragma multi_compile ___ ROTATE90 ROTATE180 ROTATE270
|
#pragma multi_compile ___ ROTATE90 ROTATE180 ROTATE270
|
||||||
#pragma multi_compile ___ USE_BEND
|
|
||||||
#pragma multi_compile ___ USE_CLIP
|
#pragma multi_compile ___ USE_CLIP
|
||||||
#pragma multi_compile _BEND_OFF _BEND_Y _BEND_Z
|
#pragma multi_compile ___ BEND_ON
|
||||||
|
#pragma multi_compile _FORWARD_Y _FORWARD_Z
|
||||||
ENDCG
|
ENDCG
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,9 +54,9 @@ Pass
|
|||||||
#pragma multi_compile ___ INVERT_X
|
#pragma multi_compile ___ INVERT_X
|
||||||
#pragma multi_compile ___ INVERT_Y
|
#pragma multi_compile ___ INVERT_Y
|
||||||
#pragma multi_compile ___ ROTATE90 ROTATE180 ROTATE270
|
#pragma multi_compile ___ ROTATE90 ROTATE180 ROTATE270
|
||||||
#pragma multi_compile ___ USE_BEND
|
|
||||||
#pragma multi_compile ___ USE_CLIP
|
#pragma multi_compile ___ USE_CLIP
|
||||||
#pragma multi_compile _BEND_OFF _BEND_Y _BEND_Z
|
#pragma multi_compile ___ BEND_ON
|
||||||
|
#pragma multi_compile _FORWARD_Y _FORWARD_Z
|
||||||
ENDCG
|
ENDCG
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user