From ec84bb38ad72b8d7b1cdd0d5701804a7105d079d Mon Sep 17 00:00:00 2001 From: excitedneon Date: Thu, 11 May 2017 06:13:52 +0300 Subject: [PATCH] Add a texture renderer for text textures --- Assets/Prefabs/PC.prefab | 2 +- Assets/Scenes/TestMap.unity | 345 +++++++++++++++++- Assets/Scripts/Entities/SyncBases/Door.cs | 4 + Assets/Scripts/Util.meta | 9 + Assets/Scripts/Util/TextTextureApplier.cs | 70 ++++ .../Scripts/Util/TextTextureApplier.cs.meta | 12 + Assets/Scripts/Util/TextTextureProperties.cs | 55 +++ .../Util/TextTextureProperties.cs.meta | 12 + Assets/Scripts/Util/TextTextureRenderer.cs | 73 ++++ .../Scripts/Util/TextTextureRenderer.cs.meta | 12 + ProjectSettings/TagManager.asset | 2 +- 11 files changed, 582 insertions(+), 14 deletions(-) create mode 100644 Assets/Scripts/Util.meta create mode 100644 Assets/Scripts/Util/TextTextureApplier.cs create mode 100644 Assets/Scripts/Util/TextTextureApplier.cs.meta create mode 100644 Assets/Scripts/Util/TextTextureProperties.cs create mode 100644 Assets/Scripts/Util/TextTextureProperties.cs.meta create mode 100644 Assets/Scripts/Util/TextTextureRenderer.cs create mode 100644 Assets/Scripts/Util/TextTextureRenderer.cs.meta diff --git a/Assets/Prefabs/PC.prefab b/Assets/Prefabs/PC.prefab index d3d7e6a..75276d8 100644 --- a/Assets/Prefabs/PC.prefab +++ b/Assets/Prefabs/PC.prefab @@ -191,7 +191,7 @@ Camera: m_Depth: 1 m_CullingMask: serializedVersion: 2 - m_Bits: 4294967295 + m_Bits: 4294967039 m_RenderingPath: -1 m_TargetTexture: {fileID: 0} m_TargetDisplay: 0 diff --git a/Assets/Scenes/TestMap.unity b/Assets/Scenes/TestMap.unity index eb68262..b30345b 100644 --- a/Assets/Scenes/TestMap.unity +++ b/Assets/Scenes/TestMap.unity @@ -130,7 +130,7 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 19192149} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 4.039651, y: -2.292325, z: -10.772432} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 769207969} @@ -503,13 +503,14 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 344272454} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 2.2207036, y: -2.900241, z: -12.007475} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 605817615} - {fileID: 1463006272} - {fileID: 1939832658} - {fileID: 375619906} + - {fileID: 1610252930} m_Father: {fileID: 0} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -570,7 +571,7 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 375619905} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -2.2207036, y: 2.900241, z: 12.007475} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 344272455} @@ -920,7 +921,7 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 605817613} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -2.2207036, y: 2.900241, z: 12.007475} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 344272455} @@ -1001,7 +1002,7 @@ Camera: m_Depth: 0 m_CullingMask: serializedVersion: 2 - m_Bits: 4294967295 + m_Bits: 4294967039 m_RenderingPath: -1 m_TargetTexture: {fileID: 0} m_TargetDisplay: 0 @@ -1020,12 +1021,116 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 769207964} m_LocalRotation: {x: 0.3826837, y: -0, z: -0, w: 0.9238795} - m_LocalPosition: {x: -4.039651, y: 7.292325, z: 5.7724323} + m_LocalPosition: {x: 0, y: 5, z: -5} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 19192150} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 45.000004, y: 0, z: 0} +--- !u!1 &784099992 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 784099997} + - component: {fileID: 784099996} + - component: {fileID: 784099995} + - component: {fileID: 784099994} + - component: {fileID: 784099993} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &784099993 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 784099992} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0e0b8f69a817648969bf8ecd70b13d4d, type: 3} + m_Name: + m_EditorClassIdentifier: + TextProperties: + Text: Hello, world!\nBoo! + Background: {r: 0, g: 0, b: 0, a: 0} + FontSize: 32 + Width: 256 + Height: 256 + Mesh: {fileID: 784099994} + MaterialIndex: 0 + Emissive: 1 + Brightness: 1 +--- !u!23 &784099994 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 784099992} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 82a7d1c3c9154445794eb04c29ab2bd3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &784099995 +BoxCollider: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 784099992} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!33 &784099996 +MeshFilter: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 784099992} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &784099997 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 784099992} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 3, y: 1.5, z: 0} + m_LocalScale: {x: 0.05, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &792995699 GameObject: m_ObjectHideFlags: 0 @@ -1298,7 +1403,7 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 949094012} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -4.039651, y: 2.292325, z: 10.772432} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1444061385} @@ -1448,7 +1553,7 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1116159554} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -2.2207036, y: 2.900241, z: 12.007475} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 1490933147} @@ -1894,7 +1999,7 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1463006270} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -2.2207036, y: 2.900241, z: 12.007475} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 344272455} @@ -1922,7 +2027,7 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1490933146} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 2.2207036, y: -2.900241, z: -12.007475} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1116159557} @@ -1930,6 +2035,133 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1610252928 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1610252930} + - component: {fileID: 1610252929} + m_Layer: 8 + m_Name: TextRenderer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1610252929 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1610252928} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9ca1db55c3aa94e6681ab393b7bae3d3, type: 3} + m_Name: + m_EditorClassIdentifier: + Camera: {fileID: 2130629208} + Text: {fileID: 1706692500} +--- !u!4 &1610252930 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1610252928} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 10, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2130629204} + - {fileID: 1706692499} + m_Father: {fileID: 344272455} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1706692498 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 1706692499} + - component: {fileID: 1706692501} + - component: {fileID: 1706692500} + m_Layer: 8 + m_Name: Rendered Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1706692499 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1706692498} + m_LocalRotation: {x: -0.000000014901159, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1, y: 1, z: 0.5} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1610252930} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!102 &1706692500 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1706692498} + m_Text: + m_OffsetZ: 0 + m_CharacterSize: 1 + m_LineSpacing: 1 + m_Anchor: 0 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 32 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 12800000, guid: 2073ef28104464427b1884c25180485b, type: 3} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!23 &1706692501 +MeshRenderer: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 1706692498} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_Materials: + - {fileID: 2100000, guid: 2073ef28104464427b1884c25180485b, type: 3} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 --- !u!1 &1708261006 GameObject: m_ObjectHideFlags: 0 @@ -2018,7 +2250,7 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1810916631} m_LocalRotation: {x: 0.30459416, y: -0.7348772, z: 0.2774102, w: 0.53872216} - m_LocalPosition: {x: -4.039651, y: 5.292325, z: 10.772432} + m_LocalPosition: {x: 0, y: 3, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 19192150} @@ -2138,7 +2370,7 @@ Transform: m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1939832656} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: -2.2207036, y: 2.900241, z: 12.007475} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 344272455} @@ -2238,3 +2470,92 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 500} m_SizeDelta: {x: 0, y: -1000} m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &2130629203 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 5 + m_Component: + - component: {fileID: 2130629204} + - component: {fileID: 2130629208} + - component: {fileID: 2130629207} + - component: {fileID: 2130629206} + - component: {fileID: 2130629205} + m_Layer: 8 + m_Name: Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2130629204 +Transform: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2130629203} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1610252930} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!81 &2130629205 +AudioListener: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2130629203} + m_Enabled: 0 +--- !u!92 &2130629206 +Behaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2130629203} + m_Enabled: 0 +--- !u!124 &2130629207 +Behaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2130629203} + m_Enabled: 0 +--- !u!20 &2130629208 +Camera: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 2130629203} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.1 + far clip plane: 1 + field of view: 60 + orthographic: 1 + orthographic size: 1 + m_Depth: -100 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 + m_StereoMirrorMode: 0 diff --git a/Assets/Scripts/Entities/SyncBases/Door.cs b/Assets/Scripts/Entities/SyncBases/Door.cs index 6557071..1aa2605 100644 --- a/Assets/Scripts/Entities/SyncBases/Door.cs +++ b/Assets/Scripts/Entities/SyncBases/Door.cs @@ -4,6 +4,10 @@ using UnityEngine; using UnityEngine.Networking; namespace Cyber.Entities.SyncBases { + + /// + /// Door that slides open and closed. Can be interacted to toggle openness. + /// public class Door : Interactable { /// diff --git a/Assets/Scripts/Util.meta b/Assets/Scripts/Util.meta new file mode 100644 index 0000000..3025af2 --- /dev/null +++ b/Assets/Scripts/Util.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c732179008d0f433dbdd20e90ee9a420 +folderAsset: yes +timeCreated: 1494463798 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Util/TextTextureApplier.cs b/Assets/Scripts/Util/TextTextureApplier.cs new file mode 100644 index 0000000..42cfa59 --- /dev/null +++ b/Assets/Scripts/Util/TextTextureApplier.cs @@ -0,0 +1,70 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using Cyber.Util; + +namespace Cyber.Util { + + /// + /// Applies a texture to a specificed material containing specified text. + /// + public class TextTextureApplier : MonoBehaviour { + + /// + /// The text and related properties that defines the texture that + /// will be applied. + /// + public TextTextureProperties TextProperties = new TextTextureProperties(""); + + /// + /// The mesh that has the material that should use this texture. + /// + public MeshRenderer Mesh; + + /// + /// The index of the material that should use this texture. + /// + public int MaterialIndex = 0; + + /// + /// Whether the Emissive or Albedo map is set. + /// + public bool Emissive = true; + + /// + /// The brightness of the texture if this is . + /// + public float Brightness = 1f; + + private TextTextureProperties LastText = new TextTextureProperties(""); + private Material Material; + private bool Dirty = true; + + /// + /// Sets the text properties. + /// + /// Properties. + public void SetTextProperties(TextTextureProperties Props) { + TextProperties = Props; + Dirty = true; + } + + private void Start() { + Material = Mesh.materials[MaterialIndex]; + } + + private void Update() { + Texture2D Tex; + if (Dirty && (Tex = TextTextureRenderer.GetText(TextProperties)) != null) { + if (Emissive) { + Material.SetTexture("_EmissionMap", Tex); + Material.SetColor("_EmissionColor", + new Color(Brightness, Brightness, Brightness)); + } else { + Material.SetTexture("_MainTex", Tex); + } + Dirty = false; + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Util/TextTextureApplier.cs.meta b/Assets/Scripts/Util/TextTextureApplier.cs.meta new file mode 100644 index 0000000..f74badd --- /dev/null +++ b/Assets/Scripts/Util/TextTextureApplier.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0e0b8f69a817648969bf8ecd70b13d4d +timeCreated: 1494467411 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Util/TextTextureProperties.cs b/Assets/Scripts/Util/TextTextureProperties.cs new file mode 100644 index 0000000..fa89e70 --- /dev/null +++ b/Assets/Scripts/Util/TextTextureProperties.cs @@ -0,0 +1,55 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Cyber.Util { + + /// + /// Text texture properties. See . + /// + [System.Serializable] + public struct TextTextureProperties { + + /// + /// The text. + /// + public string Text; + + /// + /// The background color. + /// + public Color Background; + + /// + /// The size of the font. + /// + public int FontSize; + + /// + /// The width of the texture. + /// + public int Width; + + /// + /// The height of the texture. + /// + public int Height; + + /// + /// Creates new properties for a specified kind of text. See + /// for usage. + /// + /// Text. + /// Background. + /// Font size. + /// Width. + /// Height. + public TextTextureProperties(string text, Color background = new Color(), int fontSize = 32, int width = 128, int height = 128) { + Text = text; + Background = background; + FontSize = fontSize; + Width = width; + Height = height; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Util/TextTextureProperties.cs.meta b/Assets/Scripts/Util/TextTextureProperties.cs.meta new file mode 100644 index 0000000..fbd31e0 --- /dev/null +++ b/Assets/Scripts/Util/TextTextureProperties.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4075e2774340b42f481a6dd2f5ec0259 +timeCreated: 1494463973 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Util/TextTextureRenderer.cs b/Assets/Scripts/Util/TextTextureRenderer.cs new file mode 100644 index 0000000..9b2bafd --- /dev/null +++ b/Assets/Scripts/Util/TextTextureRenderer.cs @@ -0,0 +1,73 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using Cyber.Console; + +namespace Cyber.Util { + + /// + /// Renders textures that have text written on them. + /// + public class TextTextureRenderer : MonoBehaviour { + private static TextTextureRenderer Singleton; + private static Dictionary Cache = + new Dictionary(); + + /// + /// The camera the text is rendered with. + /// + public Camera Camera; + + /// + /// The text that is rendered on screen. + /// + public TextMesh Text; + + /// + /// Sets the singleton. + /// + public TextTextureRenderer() { + Singleton = this; + } + + private Texture2D RenderText(TextTextureProperties text) { + Term.Println("Rendering: " + text.Text); + Text.text = text.Text.Replace("\\n", "\n"); + Text.fontSize = text.FontSize; + Text.characterSize = 0.5f * text.FontSize / text.Width; + + RenderTexture TextTexture = RenderTexture.GetTemporary(text.Width, text.Height); + RenderTexture OldRT = Camera.targetTexture; + Camera.targetTexture = TextTexture; + Camera.backgroundColor = text.Background; + Camera.Render(); + Camera.targetTexture = OldRT; + + OldRT = RenderTexture.active; + Texture2D Result = new Texture2D(text.Width, text.Height); + RenderTexture.active = TextTexture; + Result.ReadPixels(new Rect(0, 0, Result.width, Result.height), 0, 0); + Result.Apply(); + + RenderTexture.active = OldRT; + RenderTexture.ReleaseTemporary(TextTexture); + + return Result; + } + + /// + /// Renders a texture and caches it so it can be used as a texture + /// for a material (like a computer screen for example). + /// + /// The text. + /// Text. + /// Whether the texture should be rendered + /// again even if it's cached. + public static Texture2D GetText(TextTextureProperties text, bool forceRender = false) { + if (forceRender || !Cache.ContainsKey(text.Text)) { + Cache[text.Text] = Singleton.RenderText(text); + } + return Cache[text.Text]; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Util/TextTextureRenderer.cs.meta b/Assets/Scripts/Util/TextTextureRenderer.cs.meta new file mode 100644 index 0000000..413187f --- /dev/null +++ b/Assets/Scripts/Util/TextTextureRenderer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9ca1db55c3aa94e6681ab393b7bae3d3 +timeCreated: 1494463810 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset index 1c92a78..0c64e0b 100644 --- a/ProjectSettings/TagManager.asset +++ b/ProjectSettings/TagManager.asset @@ -13,7 +13,7 @@ TagManager: - UI - - - - + - TextTextureRendering - - -