ソースを参照

Neater ResourceManagerCode
Automatic pdb->mdb conversion for managed code debugging

Marko Pintera 10 年 前
コミット
2b6bfc1cd7
28 ファイル変更329 行追加976 行削除
  1. 7 3
      Dependencies.txt
  2. 1 224
      License/Third Party/FTL.TXT
  3. 3 0
      MBansheeEditor/MBansheeEditor.csproj
  4. 3 0
      MBansheeEngine/MBansheeEngine.csproj
  5. 4 0
      MBansheeEngine/StringTable.cs
  6. 25 12
      SBansheeEditor/Source/BsGUIResourceField.cpp
  7. 2 3
      SBansheeEditor/Source/BsScriptProjectLibrary.cpp
  8. 1 0
      SBansheeEngine/Include/BsManagedSerializableObjectInfo.h
  9. 0 27
      SBansheeEngine/Include/BsScriptAssemblyManager.h
  10. 12 200
      SBansheeEngine/Include/BsScriptResourceManager.h
  11. 2 1
      SBansheeEngine/Source/BsManagedResource.cpp
  12. 65 34
      SBansheeEngine/Source/BsManagedSerializableField.cpp
  13. 27 12
      SBansheeEngine/Source/BsManagedSerializableObjectInfo.cpp
  14. 37 85
      SBansheeEngine/Source/BsScriptAssemblyManager.cpp
  15. 4 6
      SBansheeEngine/Source/BsScriptBuiltin.cpp
  16. 11 13
      SBansheeEngine/Source/BsScriptMaterial.cpp
  17. 4 2
      SBansheeEngine/Source/BsScriptMesh.cpp
  18. 2 1
      SBansheeEngine/Source/BsScriptPlainText.cpp
  19. 2 1
      SBansheeEngine/Source/BsScriptPrefab.cpp
  20. 6 9
      SBansheeEngine/Source/BsScriptRenderTexture2D.cpp
  21. 92 330
      SBansheeEngine/Source/BsScriptResourceManager.cpp
  22. 2 1
      SBansheeEngine/Source/BsScriptScriptCode.cpp
  23. 5 5
      SBansheeEngine/Source/BsScriptSpriteTexture.cpp
  24. 4 1
      SBansheeEngine/Source/BsScriptStringTable.cpp
  25. 2 3
      SBansheeEngine/Source/BsScriptStringTableManager.cpp
  26. 2 1
      SBansheeEngine/Source/BsScriptTexture2D.cpp
  27. 2 1
      SBansheeEngine/Source/BsScriptTexture3D.cpp
  28. 2 1
      SBansheeEngine/Source/BsScriptTextureCube.cpp

+ 7 - 3
Dependencies.txt

@@ -1,9 +1,10 @@
 This document lists all Banshee 3rd party libraries and provides information on how to compile
 and include them in your own project. It is meant to be used as a guide to create your own Banshee
-project file, potentially for compiler/IDE other than Visual Studio.
+project file, potentially for compiler/IDE other than Visual Studio. Normally these files will be
+provided pre-compiled for you.
 
 BansheeEngine relies on the following 3rd party libraries:
- - Mono 3.2.3
+ - Mono 3.8.0
     - http://www.mono-project.com
 	- See MonoIntegrationGuide.txt on how to compile & integrate Mono
 
@@ -66,4 +67,7 @@ Place plug-in specific dependency files in:
   (Configuration) - Debug, Release, DebugRelease
 
 Other notes:
- - Some dependencies might not come with DebugRelease binaries, in which case use Release binaries (copy them to DebugRelease folder)
+ - Some dependencies might not come with DebugRelease binaries, in which case use Release binaries (copy them to DebugRelease folder)
+ - If you wish to compile managed assemblies using Microsoft compiler (e.g. using Visual Studio) yet still be able to debug
+   the generated assemblies, you must install Mono 3.8.0., set up an environment variable MONO_INSTALL_DIR pointing to the Mono 
+   installation directory. When this is set up "pdb2mdb" script will trigger on next compile generating the needed debug symbols.

+ 1 - 224
License/Third Party/FTL.TXT

@@ -1,219 +1,4 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
-<head>
-<title>freetype/freetype2.git - The FreeType 2 library</title>
-<meta name='generator' content='cgit v0.9.0.2'/>
-<meta name='robots' content='index, nofollow'/>
-<link rel='stylesheet' type='text/css' href='/cgit/cgit.css'/>
-<link rel='shortcut icon' href='/gitweb/git-favicon.png'/>
-<link rel='alternate' title='Atom feed' href='http://git.savannah.gnu.org/cgit/freetype/freetype2.git/atom/docs/FTL.TXT?h=master' type='application/atom+xml'/>
-</head>
-<body>
-<div id='cgit'><table id='header'>
-<tr>
-<td class='logo' rowspan='2'><a href='/cgit/'><img src='/cgit/cgit.png' alt='cgit logo'/></a></td>
-<td class='main'><a href='/cgit/'>index</a> : <a title='freetype/freetype2.git' href='/cgit/freetype/freetype2.git/'>freetype/freetype2.git</a></td><td class='form'><form method='get' action=''>
-<select name='h' onchange='this.form.submit();'>
-<option value='BRANCH-2-1-5'>BRANCH-2-1-5</option>
-<option value='CACHE'>CACHE</option>
-<option value='LAYOUT'>LAYOUT</option>
-<option value='RGB'>RGB</option>
-<option value='STABLE'>STABLE</option>
-<option value='VER-2-0-4-PATCH'>VER-2-0-4-PATCH</option>
-<option value='VER-2-1-0'>VER-2-1-0</option>
-<option value='autohinter-properties'>autohinter-properties</option>
-<option value='david-pic-changes'>david-pic-changes</option>
-<option value='dbgmem-more-limiters'>dbgmem-more-limiters</option>
-<option value='int-not32-changes'>int-not32-changes</option>
-<option value='master' selected='selected'>master</option>
-</select> <input type='submit' name='' value='switch'/></form></td></tr>
-<tr><td class='sub'>The FreeType 2 library</td><td class='sub right'>The FreeType team</td></tr></table>
-<table class='tabs'><tr><td>
-<a href='/cgit/freetype/freetype2.git/'>summary</a><a href='/cgit/freetype/freetype2.git/refs/'>refs</a><a href='/cgit/freetype/freetype2.git/log/docs/FTL.TXT'>log</a><a class='active' href='/cgit/freetype/freetype2.git/tree/docs/FTL.TXT'>tree</a><a href='/cgit/freetype/freetype2.git/commit/docs/FTL.TXT'>commit</a><a href='/cgit/freetype/freetype2.git/diff/docs/FTL.TXT'>diff</a><a href='/cgit/freetype/freetype2.git/about/'>about</a></td><td class='form'><form class='right' method='get' action='/cgit/freetype/freetype2.git/log/docs/FTL.TXT'>
-<select name='qt'>
-<option value='grep'>log msg</option>
-<option value='author'>author</option>
-<option value='committer'>committer</option>
-<option value='range'>range</option>
-</select>
-<input class='txt' type='text' size='10' name='q' value=''/>
-<input type='submit' value='search'/>
-</form>
-</td></tr></table>
-<div class='path'>path: <a href='/cgit/freetype/freetype2.git/tree/'>root</a>/<a href='/cgit/freetype/freetype2.git/tree/docs'>docs</a>/<a href='/cgit/freetype/freetype2.git/tree/docs/FTL.TXT'>FTL.TXT</a></div><div class='content'>blob: bbaba33f47d92ee4ed527582d96aeebf54cdcbb0 (<a href='/cgit/freetype/freetype2.git/plain/docs/FTL.TXT'>plain</a>)
-<table summary='blob content' class='blob'>
-<tr><td class='linenumbers'><pre><a class='no' id='n1' name='n1' href='#n1'>1</a>
-<a class='no' id='n2' name='n2' href='#n2'>2</a>
-<a class='no' id='n3' name='n3' href='#n3'>3</a>
-<a class='no' id='n4' name='n4' href='#n4'>4</a>
-<a class='no' id='n5' name='n5' href='#n5'>5</a>
-<a class='no' id='n6' name='n6' href='#n6'>6</a>
-<a class='no' id='n7' name='n7' href='#n7'>7</a>
-<a class='no' id='n8' name='n8' href='#n8'>8</a>
-<a class='no' id='n9' name='n9' href='#n9'>9</a>
-<a class='no' id='n10' name='n10' href='#n10'>10</a>
-<a class='no' id='n11' name='n11' href='#n11'>11</a>
-<a class='no' id='n12' name='n12' href='#n12'>12</a>
-<a class='no' id='n13' name='n13' href='#n13'>13</a>
-<a class='no' id='n14' name='n14' href='#n14'>14</a>
-<a class='no' id='n15' name='n15' href='#n15'>15</a>
-<a class='no' id='n16' name='n16' href='#n16'>16</a>
-<a class='no' id='n17' name='n17' href='#n17'>17</a>
-<a class='no' id='n18' name='n18' href='#n18'>18</a>
-<a class='no' id='n19' name='n19' href='#n19'>19</a>
-<a class='no' id='n20' name='n20' href='#n20'>20</a>
-<a class='no' id='n21' name='n21' href='#n21'>21</a>
-<a class='no' id='n22' name='n22' href='#n22'>22</a>
-<a class='no' id='n23' name='n23' href='#n23'>23</a>
-<a class='no' id='n24' name='n24' href='#n24'>24</a>
-<a class='no' id='n25' name='n25' href='#n25'>25</a>
-<a class='no' id='n26' name='n26' href='#n26'>26</a>
-<a class='no' id='n27' name='n27' href='#n27'>27</a>
-<a class='no' id='n28' name='n28' href='#n28'>28</a>
-<a class='no' id='n29' name='n29' href='#n29'>29</a>
-<a class='no' id='n30' name='n30' href='#n30'>30</a>
-<a class='no' id='n31' name='n31' href='#n31'>31</a>
-<a class='no' id='n32' name='n32' href='#n32'>32</a>
-<a class='no' id='n33' name='n33' href='#n33'>33</a>
-<a class='no' id='n34' name='n34' href='#n34'>34</a>
-<a class='no' id='n35' name='n35' href='#n35'>35</a>
-<a class='no' id='n36' name='n36' href='#n36'>36</a>
-<a class='no' id='n37' name='n37' href='#n37'>37</a>
-<a class='no' id='n38' name='n38' href='#n38'>38</a>
-<a class='no' id='n39' name='n39' href='#n39'>39</a>
-<a class='no' id='n40' name='n40' href='#n40'>40</a>
-<a class='no' id='n41' name='n41' href='#n41'>41</a>
-<a class='no' id='n42' name='n42' href='#n42'>42</a>
-<a class='no' id='n43' name='n43' href='#n43'>43</a>
-<a class='no' id='n44' name='n44' href='#n44'>44</a>
-<a class='no' id='n45' name='n45' href='#n45'>45</a>
-<a class='no' id='n46' name='n46' href='#n46'>46</a>
-<a class='no' id='n47' name='n47' href='#n47'>47</a>
-<a class='no' id='n48' name='n48' href='#n48'>48</a>
-<a class='no' id='n49' name='n49' href='#n49'>49</a>
-<a class='no' id='n50' name='n50' href='#n50'>50</a>
-<a class='no' id='n51' name='n51' href='#n51'>51</a>
-<a class='no' id='n52' name='n52' href='#n52'>52</a>
-<a class='no' id='n53' name='n53' href='#n53'>53</a>
-<a class='no' id='n54' name='n54' href='#n54'>54</a>
-<a class='no' id='n55' name='n55' href='#n55'>55</a>
-<a class='no' id='n56' name='n56' href='#n56'>56</a>
-<a class='no' id='n57' name='n57' href='#n57'>57</a>
-<a class='no' id='n58' name='n58' href='#n58'>58</a>
-<a class='no' id='n59' name='n59' href='#n59'>59</a>
-<a class='no' id='n60' name='n60' href='#n60'>60</a>
-<a class='no' id='n61' name='n61' href='#n61'>61</a>
-<a class='no' id='n62' name='n62' href='#n62'>62</a>
-<a class='no' id='n63' name='n63' href='#n63'>63</a>
-<a class='no' id='n64' name='n64' href='#n64'>64</a>
-<a class='no' id='n65' name='n65' href='#n65'>65</a>
-<a class='no' id='n66' name='n66' href='#n66'>66</a>
-<a class='no' id='n67' name='n67' href='#n67'>67</a>
-<a class='no' id='n68' name='n68' href='#n68'>68</a>
-<a class='no' id='n69' name='n69' href='#n69'>69</a>
-<a class='no' id='n70' name='n70' href='#n70'>70</a>
-<a class='no' id='n71' name='n71' href='#n71'>71</a>
-<a class='no' id='n72' name='n72' href='#n72'>72</a>
-<a class='no' id='n73' name='n73' href='#n73'>73</a>
-<a class='no' id='n74' name='n74' href='#n74'>74</a>
-<a class='no' id='n75' name='n75' href='#n75'>75</a>
-<a class='no' id='n76' name='n76' href='#n76'>76</a>
-<a class='no' id='n77' name='n77' href='#n77'>77</a>
-<a class='no' id='n78' name='n78' href='#n78'>78</a>
-<a class='no' id='n79' name='n79' href='#n79'>79</a>
-<a class='no' id='n80' name='n80' href='#n80'>80</a>
-<a class='no' id='n81' name='n81' href='#n81'>81</a>
-<a class='no' id='n82' name='n82' href='#n82'>82</a>
-<a class='no' id='n83' name='n83' href='#n83'>83</a>
-<a class='no' id='n84' name='n84' href='#n84'>84</a>
-<a class='no' id='n85' name='n85' href='#n85'>85</a>
-<a class='no' id='n86' name='n86' href='#n86'>86</a>
-<a class='no' id='n87' name='n87' href='#n87'>87</a>
-<a class='no' id='n88' name='n88' href='#n88'>88</a>
-<a class='no' id='n89' name='n89' href='#n89'>89</a>
-<a class='no' id='n90' name='n90' href='#n90'>90</a>
-<a class='no' id='n91' name='n91' href='#n91'>91</a>
-<a class='no' id='n92' name='n92' href='#n92'>92</a>
-<a class='no' id='n93' name='n93' href='#n93'>93</a>
-<a class='no' id='n94' name='n94' href='#n94'>94</a>
-<a class='no' id='n95' name='n95' href='#n95'>95</a>
-<a class='no' id='n96' name='n96' href='#n96'>96</a>
-<a class='no' id='n97' name='n97' href='#n97'>97</a>
-<a class='no' id='n98' name='n98' href='#n98'>98</a>
-<a class='no' id='n99' name='n99' href='#n99'>99</a>
-<a class='no' id='n100' name='n100' href='#n100'>100</a>
-<a class='no' id='n101' name='n101' href='#n101'>101</a>
-<a class='no' id='n102' name='n102' href='#n102'>102</a>
-<a class='no' id='n103' name='n103' href='#n103'>103</a>
-<a class='no' id='n104' name='n104' href='#n104'>104</a>
-<a class='no' id='n105' name='n105' href='#n105'>105</a>
-<a class='no' id='n106' name='n106' href='#n106'>106</a>
-<a class='no' id='n107' name='n107' href='#n107'>107</a>
-<a class='no' id='n108' name='n108' href='#n108'>108</a>
-<a class='no' id='n109' name='n109' href='#n109'>109</a>
-<a class='no' id='n110' name='n110' href='#n110'>110</a>
-<a class='no' id='n111' name='n111' href='#n111'>111</a>
-<a class='no' id='n112' name='n112' href='#n112'>112</a>
-<a class='no' id='n113' name='n113' href='#n113'>113</a>
-<a class='no' id='n114' name='n114' href='#n114'>114</a>
-<a class='no' id='n115' name='n115' href='#n115'>115</a>
-<a class='no' id='n116' name='n116' href='#n116'>116</a>
-<a class='no' id='n117' name='n117' href='#n117'>117</a>
-<a class='no' id='n118' name='n118' href='#n118'>118</a>
-<a class='no' id='n119' name='n119' href='#n119'>119</a>
-<a class='no' id='n120' name='n120' href='#n120'>120</a>
-<a class='no' id='n121' name='n121' href='#n121'>121</a>
-<a class='no' id='n122' name='n122' href='#n122'>122</a>
-<a class='no' id='n123' name='n123' href='#n123'>123</a>
-<a class='no' id='n124' name='n124' href='#n124'>124</a>
-<a class='no' id='n125' name='n125' href='#n125'>125</a>
-<a class='no' id='n126' name='n126' href='#n126'>126</a>
-<a class='no' id='n127' name='n127' href='#n127'>127</a>
-<a class='no' id='n128' name='n128' href='#n128'>128</a>
-<a class='no' id='n129' name='n129' href='#n129'>129</a>
-<a class='no' id='n130' name='n130' href='#n130'>130</a>
-<a class='no' id='n131' name='n131' href='#n131'>131</a>
-<a class='no' id='n132' name='n132' href='#n132'>132</a>
-<a class='no' id='n133' name='n133' href='#n133'>133</a>
-<a class='no' id='n134' name='n134' href='#n134'>134</a>
-<a class='no' id='n135' name='n135' href='#n135'>135</a>
-<a class='no' id='n136' name='n136' href='#n136'>136</a>
-<a class='no' id='n137' name='n137' href='#n137'>137</a>
-<a class='no' id='n138' name='n138' href='#n138'>138</a>
-<a class='no' id='n139' name='n139' href='#n139'>139</a>
-<a class='no' id='n140' name='n140' href='#n140'>140</a>
-<a class='no' id='n141' name='n141' href='#n141'>141</a>
-<a class='no' id='n142' name='n142' href='#n142'>142</a>
-<a class='no' id='n143' name='n143' href='#n143'>143</a>
-<a class='no' id='n144' name='n144' href='#n144'>144</a>
-<a class='no' id='n145' name='n145' href='#n145'>145</a>
-<a class='no' id='n146' name='n146' href='#n146'>146</a>
-<a class='no' id='n147' name='n147' href='#n147'>147</a>
-<a class='no' id='n148' name='n148' href='#n148'>148</a>
-<a class='no' id='n149' name='n149' href='#n149'>149</a>
-<a class='no' id='n150' name='n150' href='#n150'>150</a>
-<a class='no' id='n151' name='n151' href='#n151'>151</a>
-<a class='no' id='n152' name='n152' href='#n152'>152</a>
-<a class='no' id='n153' name='n153' href='#n153'>153</a>
-<a class='no' id='n154' name='n154' href='#n154'>154</a>
-<a class='no' id='n155' name='n155' href='#n155'>155</a>
-<a class='no' id='n156' name='n156' href='#n156'>156</a>
-<a class='no' id='n157' name='n157' href='#n157'>157</a>
-<a class='no' id='n158' name='n158' href='#n158'>158</a>
-<a class='no' id='n159' name='n159' href='#n159'>159</a>
-<a class='no' id='n160' name='n160' href='#n160'>160</a>
-<a class='no' id='n161' name='n161' href='#n161'>161</a>
-<a class='no' id='n162' name='n162' href='#n162'>162</a>
-<a class='no' id='n163' name='n163' href='#n163'>163</a>
-<a class='no' id='n164' name='n164' href='#n164'>164</a>
-<a class='no' id='n165' name='n165' href='#n165'>165</a>
-<a class='no' id='n166' name='n166' href='#n166'>166</a>
-<a class='no' id='n167' name='n167' href='#n167'>167</a>
-<a class='no' id='n168' name='n168' href='#n168'>168</a>
-<a class='no' id='n169' name='n169' href='#n169'>169</a>
-</pre></td>
-<td class='lines'><pre><code>                    The FreeType Project LICENSE
+                    The FreeType Project LICENSE
                     ----------------------------
 
                             2006-Jan-27
@@ -379,11 +164,3 @@ Legal Terms
   Our home page can be found at
 
     http://www.freetype.org
-
-
---- end of FTL.TXT ---
-</code></pre></td></tr></table>
-</div> <!-- class=content -->
-</div> <!-- id=cgit -->
-</body>
-</html>

+ 3 - 0
MBansheeEditor/MBansheeEditor.csproj

@@ -138,6 +138,9 @@
     </ProjectReference>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PostBuildEvent>$(SolutionDir)Dependencies\tools\pdb2mdb.bat "$(TargetPath)"</PostBuildEvent>
+  </PropertyGroup>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
   <Target Name="BeforeBuild">

+ 3 - 0
MBansheeEngine/MBansheeEngine.csproj

@@ -147,6 +147,9 @@
     <Compile Include="VirtualInput.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PostBuildEvent>$(SolutionDir)Dependencies\tools\pdb2mdb.bat "$(TargetPath)"</PostBuildEvent>
+  </PropertyGroup>
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
        Other similar extension points exist, see Microsoft.Common.targets.
   <Target Name="BeforeBuild">

+ 4 - 0
MBansheeEngine/StringTable.cs

@@ -8,6 +8,10 @@ namespace BansheeEngine
 {
     public sealed class StringTable : Resource
     {
+        // Constructor for runtime use only (dummy parameter to differentiate from the normal constructor)
+        private StringTable(bool dummy)
+        {  }
+
         public StringTable()
         {
             Internal_CreateInstance(this);

+ 25 - 12
SBansheeEditor/Source/BsGUIResourceField.cpp

@@ -17,6 +17,19 @@
 #include "BsProjectResourceMeta.h"
 #include "BsManagedResourceMetaData.h"
 #include "BsBuiltinEditorResources.h"
+#include "BsScriptTexture2D.h"
+#include "BsScriptTexture3D.h"
+#include "BsScriptTextureCube.h"
+#include "BsScriptSpriteTexture.h"
+#include "BsScriptMaterial.h"
+#include "BsScriptMesh.h"
+#include "BsScriptFont.h"
+#include "BsScriptShader.h"
+#include "BsScriptPlainText.h"
+#include "BsScriptScriptCode.h"
+#include "BsScriptStringTable.h"
+#include "BsScriptPrefab.h"
+#include "BsScriptManagedResource.h"
 
 using namespace std::placeholders;
 
@@ -239,9 +252,9 @@ namespace BansheeEngine
 			case TID_Texture:
 			{
 				// TODO - Need to distinguish from 2D/3D/Cube
-				if (ScriptAssemblyManager::instance().getTexture2DClass()->isSubClassOf(acceptedClass) ||
-					ScriptAssemblyManager::instance().getTexture3DClass()->isSubClassOf(acceptedClass) ||
-					ScriptAssemblyManager::instance().getTextureCubeClass()->isSubClassOf(acceptedClass))
+				if (ScriptTexture2D::getMetaData()->scriptClass->isSubClassOf(acceptedClass) ||
+					ScriptTexture3D::getMetaData()->scriptClass->isSubClassOf(acceptedClass) ||
+					ScriptTextureCube::getMetaData()->scriptClass->isSubClassOf(acceptedClass))
 				{
 					setUUID(uuid);
 					found = true;
@@ -250,7 +263,7 @@ namespace BansheeEngine
 				break;
 			case TID_SpriteTexture:
 			{
-				if (ScriptAssemblyManager::instance().getSpriteTextureClass()->isSubClassOf(acceptedClass))
+				if (ScriptSpriteTexture::getMetaData()->scriptClass->isSubClassOf(acceptedClass))
 				{
 					setUUID(uuid);
 					found = true;
@@ -259,7 +272,7 @@ namespace BansheeEngine
 				break;
 			case TID_Font:
 			{
-				if (ScriptAssemblyManager::instance().getFontClass()->isSubClassOf(acceptedClass))
+				if (ScriptFont::getMetaData()->scriptClass->isSubClassOf(acceptedClass))
 				{
 					setUUID(uuid);
 					found = true;
@@ -268,7 +281,7 @@ namespace BansheeEngine
 				break;
 			case TID_PlainText:
 			{
-				if (ScriptAssemblyManager::instance().getPlainTextClass()->isSubClassOf(acceptedClass))
+				if (ScriptPlainText::getMetaData()->scriptClass->isSubClassOf(acceptedClass))
 				{
 					setUUID(uuid);
 					found = true;
@@ -277,7 +290,7 @@ namespace BansheeEngine
 				break;
 			case TID_ScriptCode:
 			{
-				if (ScriptAssemblyManager::instance().getScriptCodeClass()->isSubClassOf(acceptedClass))
+				if (ScriptScriptCode::getMetaData()->scriptClass->isSubClassOf(acceptedClass))
 				{
 					setUUID(uuid);
 					found = true;
@@ -286,7 +299,7 @@ namespace BansheeEngine
 				break;
 			case TID_Shader:
 			{
-				if (ScriptAssemblyManager::instance().getShaderClass()->isSubClassOf(acceptedClass))
+				if (ScriptShader::getMetaData()->scriptClass->isSubClassOf(acceptedClass))
 				{
 					setUUID(uuid);
 					found = true;
@@ -295,7 +308,7 @@ namespace BansheeEngine
 				break;
 			case TID_Material:
 			{
-				if (ScriptAssemblyManager::instance().getMaterialClass()->isSubClassOf(acceptedClass))
+				if (ScriptMaterial::getMetaData()->scriptClass->isSubClassOf(acceptedClass))
 				{
 					setUUID(uuid);
 					found = true;
@@ -304,7 +317,7 @@ namespace BansheeEngine
 				break;
 			case TID_Mesh:
 			{
-				if (ScriptAssemblyManager::instance().getMeshClass()->isSubClassOf(acceptedClass))
+				if (ScriptMesh::getMetaData()->scriptClass->isSubClassOf(acceptedClass))
 				{
 					setUUID(uuid);
 					found = true;
@@ -313,7 +326,7 @@ namespace BansheeEngine
 				break;
 			case TID_Prefab:
 			{
-				if (ScriptAssemblyManager::instance().getPrefabClass()->isSubClassOf(acceptedClass))
+				if (ScriptPrefab::getMetaData()->scriptClass->isSubClassOf(acceptedClass))
 				{
 					setUUID(uuid);
 					found = true;
@@ -321,7 +334,7 @@ namespace BansheeEngine
 			}
 			case TID_StringTable:
 			{
-				if (ScriptAssemblyManager::instance().getStringTableClass()->isSubClassOf(acceptedClass))
+				if (ScriptStringTable::getMetaData()->scriptClass->isSubClassOf(acceptedClass))
 				{
 					setUUID(uuid);
 					found = true;

+ 2 - 3
SBansheeEditor/Source/BsScriptProjectLibrary.cpp

@@ -93,9 +93,8 @@ namespace BansheeEngine
 		if (!resource)
 			return nullptr;
 
-		ScriptResourceBase* scriptResource = ScriptResourceManager::instance().getScriptResource(resource.getUUID());
-		if (scriptResource == nullptr)
-			scriptResource = ScriptResourceManager::instance().createScriptResource(resource);
+		ScriptResourceBase* scriptResource;
+		ScriptResourceManager::instance().getScriptResource(resource, &scriptResource, true);
 
 		return scriptResource->getManagedInstance();
 	}

+ 1 - 0
SBansheeEngine/Include/BsManagedSerializableObjectInfo.h

@@ -32,6 +32,7 @@ namespace BansheeEngine
 		MaterialRef,
 		MeshRef,
 		PrefabRef,
+		FontRef,
 		StringTableRef,
 		SceneObjectRef,
 		ComponentRef

+ 0 - 27
SBansheeEngine/Include/BsScriptAssemblyManager.h

@@ -26,19 +26,6 @@ namespace BansheeEngine
 		MonoClass* getComponentClass() const { return mComponentClass; }
 		MonoClass* getMissingComponentClass() const { return mMissingComponentClass; }
 		MonoClass* getSceneObjectClass() const { return mSceneObjectClass; }
-		MonoClass* getManagedResourceClass() const { return mManagedResourceClass; }
-		MonoClass* getTexture2DClass() const { return mTexture2DClass; }
-		MonoClass* getTexture3DClass() const { return mTexture3DClass; }
-		MonoClass* getTextureCubeClass() const { return mTextureCubeClass; }
-		MonoClass* getSpriteTextureClass() const { return mSpriteTextureClass; }
-		MonoClass* getShaderClass() const { return mShaderClass; }
-		MonoClass* getMaterialClass() const { return mMaterialClass; }
-		MonoClass* getMeshClass() const { return mMeshClass; }
-		MonoClass* getFontClass() const { return mFontClass; }
-		MonoClass* getPrefabClass() const { return mPrefabClass; }
-		MonoClass* getStringTableClass() const { return mStringTableClass; }
-		MonoClass* getPlainTextClass() const { return mPlainTextClass; }
-		MonoClass* getScriptCodeClass() const { return mScriptCodeClass; }
 
 		ManagedSerializableTypeInfoPtr determineType(MonoClass* monoClass);
 	private:
@@ -53,20 +40,6 @@ namespace BansheeEngine
 		MonoClass* mSceneObjectClass;
 		MonoClass* mMissingComponentClass;
 
-		MonoClass* mTexture2DClass;
-		MonoClass* mTexture3DClass;
-		MonoClass* mTextureCubeClass;
-		MonoClass* mSpriteTextureClass;
-		MonoClass* mShaderClass;
-		MonoClass* mMaterialClass;
-		MonoClass* mMeshClass;
-		MonoClass* mManagedResourceClass;
-		MonoClass* mFontClass;
-		MonoClass* mPrefabClass;
-		MonoClass* mStringTableClass;
-		MonoClass* mPlainTextClass;
-		MonoClass* mScriptCodeClass;
-
 		MonoClass* mSerializeObjectAttribute;
 		MonoClass* mDontSerializeFieldAttribute;
 		MonoClass* mSerializeFieldAttribute;

+ 12 - 200
SBansheeEngine/Include/BsScriptResourceManager.h

@@ -15,222 +15,34 @@ namespace BansheeEngine
 		 * @note Throws an exception if resource for the handle already exists.
 		 * 		 Creates a new managed instance of the object.
 		 */
-		ScriptTexture2D* createScriptTexture2D(const HTexture& resourceHandle);
-
-		/**
-		* @note Throws an exception if resource for the handle already exists.
-		* 		 Creates a new managed instance of the object.
-		*/
-		ScriptTexture3D* createScriptTexture3D(const HTexture& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Creates a new managed instance of the object.
-		 */
-		ScriptTextureCube* createScriptTextureCube(const HTexture& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptTexture2D* createScriptTexture2D(MonoObject* existingInstance, const HTexture& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptTexture3D* createScriptTexture3D(MonoObject* existingInstance, const HTexture& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptTextureCube* createScriptTextureCube(MonoObject* existingInstance, const HTexture& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptShader* createScriptShader(const HShader& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptShader* createScriptShader(MonoObject* existingInstance, const HShader& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptMaterial* createScriptMaterial(const HMaterial& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptMaterial* createScriptMaterial(MonoObject* existingInstance, const HMaterial& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptMesh* createScriptMesh(const HMesh& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptMesh* createScriptMesh(MonoObject* existingInstance, const HMesh& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptPlainText* createScriptPlainText(const HPlainText& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptPlainText* createScriptPlainText(MonoObject* existingInstance, const HPlainText& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptScriptCode* createScriptScriptCode(const HScriptCode& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptScriptCode* createScriptScriptCode(MonoObject* existingInstance, const HScriptCode& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Creates a new managed instance of the object.
-		 */
-		ScriptSpriteTexture* createScriptSpriteTexture(const HSpriteTexture& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptSpriteTexture* createScriptSpriteTexture(MonoObject* existingInstance, const HSpriteTexture& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Creates a new managed instance of the object.
-		 */
-		ScriptFont* createScriptFont(const HFont& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptFont* createScriptFont(MonoObject* existingInstance, const HFont& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Creates a new managed instance of the object.
-		 */
-		ScriptPrefab* createScriptPrefab(const HPrefab& resourceHandle);
+		template<class RetType, class InType>
+		void createScriptResource(const ResourceHandle<InType>& resourceHandle, RetType** out);
 
 		/**
 		 * @note Throws an exception if resource for the handle already exists.
 		 * 		 Initializes the ScriptResource with an existing managed instance.
 		 */
-		ScriptPrefab* createScriptPrefab(MonoObject* existingInstance, const HPrefab& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Creates a new managed instance of the object.
-		 */
-		ScriptStringTable* createScriptStringTable(const HStringTable& resourceHandle);
-
-		/**
-		 * @note Throws an exception if resource for the handle already exists.
-		 * 		 Initializes the ScriptResource with an existing managed instance.
-		 */
-		ScriptStringTable* createScriptStringTable(MonoObject* existingInstance, const HStringTable& resourceHandle);
-
-		/**
-		* @note  Throws an exception if resource for the handle already exists.
-		* 		 Initializes the ScriptResource with an existing managed instance.
-		*/
-		ScriptManagedResource* createManagedResource(MonoObject* existingInstance, const HManagedResource& resourceHandle);
-
-		/**
-		 * @note Returns nullptr if script resource doesn't exist.
-		 */
-		ScriptTexture2D* getScriptTexture2D(const HTexture& resourceHandle);
-
-		/**
-		 * @note Returns nullptr if script resource doesn't exist.
-		 */
-		ScriptTexture3D* getScriptTexture3D(const HTexture& resourceHandle);
+		template<class RetType, class InType>
+		void createScriptResource(MonoObject* existingInstance, const ResourceHandle<InType>& resourceHandle, RetType** out);
 
 		/**
-		 * @note Returns nullptr if script resource doesn't exist.
-		 */
-		ScriptTextureCube* getScriptTextureCube(const HTexture& resourceHandle);
-
-		/**
-		 * @note Returns nullptr if script resource doesn't exist.
-		 */
-		ScriptShader* getScriptShader(const HShader& resourceHandle);
-
-		/**
-		 * @note Returns nullptr if script resource doesn't exist.
-		 */
-		ScriptMaterial* getScriptMaterial(const HMaterial& resourceHandle);
-
-		/**
-		 * @note Returns nullptr if script resource doesn't exist.
+		 * @note If @p create is true, creates a new script resource if one doesn't exist, 
+		 *		 otherwise returns nullptr if script resource doesn't exist.
 		 */
-		ScriptMesh* getScriptMesh(const HMesh& resourceHandle);
+		template<class RetType, class InType>
+		void getScriptResource(const ResourceHandle<InType>& resourceHandle, RetType** out, bool create = false);
 
-		/**
-		 * @note Returns nullptr if script resource doesn't exist.
-		 */
-		ScriptSpriteTexture* getScriptSpriteTexture(const HSpriteTexture& resourceHandle);
+		template<>
+		void createScriptResource(const ResourceHandle<StringTable>& resourceHandle, ScriptStringTable** out);
 
-		/**
-		 * @note Returns nullptr if script resource doesn't exist.
-		 */
-		ScriptPlainText* getScriptPlainText(const HPlainText& resourceHandle);
-
-		/**
-		 * @note Returns nullptr if script resource doesn't exist.
-		 */
-		ScriptScriptCode* getScriptScriptCode(const HScriptCode& resourceHandle);
-
-		/**
-		 * @note Returns nullptr if script resource doesn't exist.
-		 */
-		ScriptManagedResource* getScriptManagedResource(const HManagedResource& resourceHandle);
-
-		/**
-		 * @note Returns nullptr if script resource doesn't exist.
-		 */
-		ScriptPrefab* getScriptPrefab(const HPrefab& resourceHandle);
-
-		/**
-		 * @note Returns nullptr if script resource doesn't exist.
-		 */
-		ScriptStringTable* getScriptStringTable(const HStringTable& resourceHandle);
+		template<>
+		void createScriptResource(const HResource& resourceHandle, ScriptResourceBase** out);
 
 		/**
 		 * @note Returns nullptr if script resource doesn't exist.
 		 */
 		ScriptResourceBase* getScriptResource(const String& UUID);
 
-		/**
-		 * @note Returns nullptr if script resource doesn't exist.
-		 */
-		ScriptResourceBase* createScriptResource(const HResource& resource);
-
 		void destroyScriptResource(ScriptResourceBase* resource);
 
 	private:

+ 2 - 1
SBansheeEngine/Source/BsManagedResource.cpp

@@ -115,7 +115,8 @@ namespace BansheeEngine
 		mManagedHandle = mono_gchandle_new(mManagedInstance, false);
 		mMyHandle = myHandle;
 
-		ScriptResourceManager::instance().createManagedResource(object, myHandle);
+		ScriptManagedResource* scriptInstance;
+		ScriptResourceManager::instance().createScriptResource(object, myHandle, &scriptInstance);
 		ManagedResourceManager::instance().registerManagedResource(mMyHandle);
 	}
 

+ 65 - 34
SBansheeEngine/Source/BsManagedSerializableField.cpp

@@ -16,6 +16,7 @@
 #include "BsScriptMaterial.h"
 #include "BsScriptMesh.h"
 #include "BsScriptPrefab.h"
+#include "BsScriptFont.h"
 #include "BsScriptStringTable.h"
 #include "BsScriptSceneObject.h"
 #include "BsScriptComponent.h"
@@ -258,6 +259,18 @@ namespace BansheeEngine
 
 				return fieldData;
 			}
+			case ScriptPrimitiveType::FontRef:
+			{
+				auto fieldData = bs_shared_ptr<ManagedSerializableFieldDataResourceRef>();
+
+				if (value != nullptr)
+				{
+					ScriptFont* scriptFont = ScriptFont::toNative(value);
+					fieldData->value = static_resource_cast<Font>(scriptFont->getNativeHandle());
+				}
+
+				return fieldData;
+			}
 			case ScriptPrimitiveType::StringTableRef:
 			{
 				auto fieldData = bs_shared_ptr<ManagedSerializableFieldDataResourceRef>();
@@ -545,9 +558,9 @@ namespace BansheeEngine
 				if(value)
 				{
 					HTexture texture = static_resource_cast<Texture>(value);
-					ScriptTexture2D* scriptResource = ScriptResourceManager::instance().getScriptTexture2D(texture);
-					if(scriptResource == nullptr)
-						scriptResource = ScriptResourceManager::instance().createScriptTexture2D(texture);
+
+					ScriptTexture2D* scriptResource;
+					ScriptResourceManager::instance().getScriptResource(texture, &scriptResource, true);
 
 					return scriptResource->getManagedInstance();
 				}
@@ -559,9 +572,9 @@ namespace BansheeEngine
 				if (value)
 				{
 					HTexture texture = static_resource_cast<Texture>(value);
-					ScriptTexture3D* scriptResource = ScriptResourceManager::instance().getScriptTexture3D(texture);
-					if (scriptResource == nullptr)
-						scriptResource = ScriptResourceManager::instance().createScriptTexture3D(texture);
+
+					ScriptTexture3D* scriptResource;
+					ScriptResourceManager::instance().getScriptResource(texture, &scriptResource, true);
 
 					return scriptResource->getManagedInstance();
 				}
@@ -573,9 +586,9 @@ namespace BansheeEngine
 				if (value)
 				{
 					HTexture texture = static_resource_cast<Texture>(value);
-					ScriptTextureCube* scriptResource = ScriptResourceManager::instance().getScriptTextureCube(texture);
-					if (scriptResource == nullptr)
-						scriptResource = ScriptResourceManager::instance().createScriptTextureCube(texture);
+
+					ScriptTextureCube* scriptResource;
+					ScriptResourceManager::instance().getScriptResource(texture, &scriptResource, true);
 
 					return scriptResource->getManagedInstance();
 				}
@@ -587,9 +600,9 @@ namespace BansheeEngine
 				if(value)
 				{
 					HSpriteTexture spriteTexture = static_resource_cast<SpriteTexture>(value);
-					ScriptSpriteTexture* scriptResource = ScriptResourceManager::instance().getScriptSpriteTexture(spriteTexture);
-					if(scriptResource == nullptr)
-						scriptResource = ScriptResourceManager::instance().createScriptSpriteTexture(spriteTexture);
+
+					ScriptSpriteTexture* scriptResource;
+					ScriptResourceManager::instance().getScriptResource(spriteTexture, &scriptResource, true);
 
 					if(scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
@@ -602,9 +615,9 @@ namespace BansheeEngine
 				if (value)
 				{
 					HShader shader = static_resource_cast<Shader>(value);
-					ScriptShader* scriptResource = ScriptResourceManager::instance().getScriptShader(shader);
-					if (scriptResource == nullptr)
-						scriptResource = ScriptResourceManager::instance().createScriptShader(shader);
+
+					ScriptShader* scriptResource;
+					ScriptResourceManager::instance().getScriptResource(shader, &scriptResource, true);
 
 					if (scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
@@ -617,9 +630,9 @@ namespace BansheeEngine
 				if (value)
 				{
 					HMaterial material = static_resource_cast<Material>(value);
-					ScriptMaterial* scriptResource = ScriptResourceManager::instance().getScriptMaterial(material);
-					if (scriptResource == nullptr)
-						scriptResource = ScriptResourceManager::instance().createScriptMaterial(material);
+
+					ScriptMaterial* scriptResource;
+					ScriptResourceManager::instance().getScriptResource(material, &scriptResource, true);
 
 					if (scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
@@ -632,9 +645,9 @@ namespace BansheeEngine
 				if (value)
 				{
 					HMesh mesh = static_resource_cast<Mesh>(value);
-					ScriptMesh* scriptResource = ScriptResourceManager::instance().getScriptMesh(mesh);
-					if (scriptResource == nullptr)
-						scriptResource = ScriptResourceManager::instance().createScriptMesh(mesh);
+
+					ScriptMesh* scriptResource;
+					ScriptResourceManager::instance().getScriptResource(mesh, &scriptResource, true);
 
 					if (scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
@@ -647,9 +660,9 @@ namespace BansheeEngine
 				if (value)
 				{
 					HPlainText plainText = static_resource_cast<PlainText>(value);
-					ScriptPlainText* scriptResource = ScriptResourceManager::instance().getScriptPlainText(plainText);
-					if (scriptResource == nullptr)
-						scriptResource = ScriptResourceManager::instance().createScriptPlainText(plainText);
+
+					ScriptPlainText* scriptResource;
+					ScriptResourceManager::instance().getScriptResource(plainText, &scriptResource, true);
 
 					if (scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
@@ -662,9 +675,9 @@ namespace BansheeEngine
 				if (value)
 				{
 					HScriptCode scriptCode = static_resource_cast<ScriptCode>(value);
-					ScriptScriptCode* scriptResource = ScriptResourceManager::instance().getScriptScriptCode(scriptCode);
-					if (scriptResource == nullptr)
-						scriptResource = ScriptResourceManager::instance().createScriptScriptCode(scriptCode);
+
+					ScriptScriptCode* scriptResource;
+					ScriptResourceManager::instance().getScriptResource(scriptCode, &scriptResource, true);
 
 					if (scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
@@ -677,9 +690,24 @@ namespace BansheeEngine
 				if (value)
 				{
 					HPrefab prefab = static_resource_cast<Prefab>(value);
-					ScriptPrefab* scriptResource = ScriptResourceManager::instance().getScriptPrefab(prefab);
-					if (scriptResource == nullptr)
-						scriptResource = ScriptResourceManager::instance().createScriptPrefab(prefab);
+
+					ScriptPrefab* scriptResource;
+					ScriptResourceManager::instance().getScriptResource(prefab, &scriptResource, true);
+
+					if (scriptResource != nullptr)
+						return scriptResource->getManagedInstance();
+				}
+				else
+					return nullptr;
+			}
+			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::FontRef)
+			{
+				if (value)
+				{
+					HFont font = static_resource_cast<Font>(value);
+
+					ScriptFont* scriptResource;
+					ScriptResourceManager::instance().getScriptResource(font, &scriptResource, true);
 
 					if (scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
@@ -692,9 +720,9 @@ namespace BansheeEngine
 				if (value)
 				{
 					HStringTable stringTable = static_resource_cast<StringTable>(value);
-					ScriptStringTable* scriptResource = ScriptResourceManager::instance().getScriptStringTable(stringTable);
-					if (scriptResource == nullptr)
-						scriptResource = ScriptResourceManager::instance().createScriptStringTable(stringTable);
+
+					ScriptStringTable* scriptResource;
+					ScriptResourceManager::instance().getScriptResource(stringTable, &scriptResource, true);
 
 					if (scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
@@ -707,7 +735,10 @@ namespace BansheeEngine
 				if (value)
 				{
 					HManagedResource managedResource = static_resource_cast<ManagedResource>(value);
-					ScriptManagedResource* scriptResource = ScriptResourceManager::instance().getScriptManagedResource(managedResource);
+
+					ScriptManagedResource* scriptResource;
+					ScriptResourceManager::instance().getScriptResource(managedResource, &scriptResource, true);
+
 					assert(scriptResource != nullptr); // Managed resource managed instance is created upon creation so it may never be null
 
 					return scriptResource->getManagedInstance();

+ 27 - 12
SBansheeEngine/Source/BsManagedSerializableObjectInfo.cpp

@@ -12,6 +12,19 @@
 #include "BsScriptSceneObject.h"
 #include "BsManagedSerializableObjectInfo.h"
 #include "BsScriptAssemblyManager.h"
+#include "BsScriptTexture2D.h"
+#include "BsScriptTexture3D.h"
+#include "BsScriptTextureCube.h"
+#include "BsScriptSpriteTexture.h"
+#include "BsScriptMaterial.h"
+#include "BsScriptMesh.h"
+#include "BsScriptFont.h"
+#include "BsScriptShader.h"
+#include "BsScriptPlainText.h"
+#include "BsScriptScriptCode.h"
+#include "BsScriptStringTable.h"
+#include "BsScriptPrefab.h"
+#include "BsScriptManagedResource.h"
 
 namespace BansheeEngine
 {
@@ -148,29 +161,31 @@ namespace BansheeEngine
 		case ScriptPrimitiveType::String:
 			return mono_get_string_class();
 		case ScriptPrimitiveType::Texture2DRef:
-			return ScriptAssemblyManager::instance().getTexture2DClass()->_getInternalClass();
+			return ScriptTexture2D::getMetaData()->scriptClass->_getInternalClass();
 		case ScriptPrimitiveType::Texture3DRef:
-			return ScriptAssemblyManager::instance().getTexture3DClass()->_getInternalClass();
+			return ScriptTexture3D::getMetaData()->scriptClass->_getInternalClass();
 		case ScriptPrimitiveType::TextureCubeRef:
-			return ScriptAssemblyManager::instance().getTextureCubeClass()->_getInternalClass();
+			return ScriptTextureCube::getMetaData()->scriptClass->_getInternalClass();
 		case ScriptPrimitiveType::SpriteTextureRef:
-			return ScriptAssemblyManager::instance().getSpriteTextureClass()->_getInternalClass();
+			return ScriptSpriteTexture::getMetaData()->scriptClass->_getInternalClass();
 		case ScriptPrimitiveType::ShaderRef:
-			return ScriptAssemblyManager::instance().getShaderClass()->_getInternalClass();
+			return ScriptShader::getMetaData()->scriptClass->_getInternalClass();
 		case ScriptPrimitiveType::MaterialRef:
-			return ScriptAssemblyManager::instance().getMaterialClass()->_getInternalClass();
+			return ScriptMaterial::getMetaData()->scriptClass->_getInternalClass();
 		case ScriptPrimitiveType::MeshRef:
-			return ScriptAssemblyManager::instance().getMeshClass()->_getInternalClass();
+			return ScriptMesh::getMetaData()->scriptClass->_getInternalClass();
 		case ScriptPrimitiveType::ManagedResourceRef:
-			return ScriptAssemblyManager::instance().getManagedResourceClass()->_getInternalClass();
+			return ScriptManagedResource::getMetaData()->scriptClass->_getInternalClass();
 		case ScriptPrimitiveType::PlainTextRef:
-			return ScriptAssemblyManager::instance().getPlainTextClass()->_getInternalClass();
+			return ScriptPlainText::getMetaData()->scriptClass->_getInternalClass();
 		case ScriptPrimitiveType::ScriptCodeRef:
-			return ScriptAssemblyManager::instance().getScriptCodeClass()->_getInternalClass();
+			return ScriptScriptCode::getMetaData()->scriptClass->_getInternalClass();
 		case ScriptPrimitiveType::PrefabRef:
-			return ScriptAssemblyManager::instance().getPrefabClass()->_getInternalClass();
+			return ScriptPrefab::getMetaData()->scriptClass->_getInternalClass();
+		case ScriptPrimitiveType::FontRef:
+			return ScriptFont::getMetaData()->scriptClass->_getInternalClass();
 		case ScriptPrimitiveType::StringTableRef:
-			return ScriptAssemblyManager::instance().getStringTableClass()->_getInternalClass();
+			return ScriptStringTable::getMetaData()->scriptClass->_getInternalClass();
 		case ScriptPrimitiveType::SceneObjectRef:
 			return ScriptAssemblyManager::instance().getSceneObjectClass()->_getInternalClass();
 		case ScriptPrimitiveType::ComponentRef:

+ 37 - 85
SBansheeEngine/Source/BsScriptAssemblyManager.cpp

@@ -8,6 +8,19 @@
 #include "BsMonoField.h"
 #include "BsMonoMethod.h"
 #include "BsMonoProperty.h"
+#include "BsScriptManagedResource.h"
+#include "BsScriptTexture2D.h"
+#include "BsScriptTexture3D.h"
+#include "BsScriptTextureCube.h"
+#include "BsScriptSpriteTexture.h"
+#include "BsScriptMaterial.h"
+#include "BsScriptMesh.h"
+#include "BsScriptFont.h"
+#include "BsScriptShader.h"
+#include "BsScriptPlainText.h"
+#include "BsScriptScriptCode.h"
+#include "BsScriptStringTable.h"
+#include "BsScriptPrefab.h"
 #include "BsMonoUtil.h"
 #include "BsRTTIType.h"
 
@@ -15,11 +28,8 @@ namespace BansheeEngine
 {
 	ScriptAssemblyManager::ScriptAssemblyManager()
 		:mBaseTypesInitialized(false), mSerializeObjectAttribute(nullptr), mDontSerializeFieldAttribute(nullptr), 
-		mComponentClass(nullptr), mSceneObjectClass(nullptr), mTexture2DClass(nullptr), mSpriteTextureClass(nullptr),
-		mSerializeFieldAttribute(nullptr), mHideInInspectorAttribute(nullptr), mSystemArrayClass(nullptr), mSystemGenericListClass(nullptr),
-		mSystemGenericDictionaryClass(nullptr), mManagedResourceClass(nullptr), mFontClass(nullptr), mMissingComponentClass(nullptr),
-		mPlainTextClass(nullptr), mScriptCodeClass(nullptr), mShaderClass(nullptr), mMaterialClass(nullptr), mTexture3DClass(nullptr),
-		mTextureCubeClass(nullptr), mMeshClass(nullptr), mPrefabClass(nullptr), mStringTableClass(nullptr)
+		mComponentClass(nullptr), mSceneObjectClass(nullptr), mSerializeFieldAttribute(nullptr), mHideInInspectorAttribute(nullptr), 
+		mSystemArrayClass(nullptr), mSystemGenericListClass(nullptr), mSystemGenericDictionaryClass(nullptr), mMissingComponentClass(nullptr)
 	{
 
 	}
@@ -55,12 +65,14 @@ namespace BansheeEngine
 
 		mAssemblyInfos[assemblyName] = assemblyInfo;
 
+		MonoClass* managedResourceClass = ScriptManagedResource::getMetaData()->scriptClass;
+
 		// Populate class data
 		const Vector<MonoClass*>& allClasses = curAssembly->getAllClasses();
 		for(auto& curClass : allClasses)
 		{
-			if((curClass->isSubClassOf(mComponentClass) || curClass->isSubClassOf(mManagedResourceClass) || 
-				curClass->hasAttribute(mSerializeObjectAttribute)) && curClass != mComponentClass && curClass != mManagedResourceClass)
+			if ((curClass->isSubClassOf(mComponentClass) || curClass->isSubClassOf(managedResourceClass) ||
+				curClass->hasAttribute(mSerializeObjectAttribute)) && curClass != mComponentClass && curClass != managedResourceClass)
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoObject> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoObject>();
 				typeInfo->mTypeNamespace = curClass->getNamespace();
@@ -259,73 +271,79 @@ namespace BansheeEngine
 				return typeInfo;
 			}
 		case MONO_TYPE_CLASS:
-			if(monoClass->isSubClassOf(mTexture2DClass))
+			if(monoClass->isSubClassOf(ScriptTexture2D::getMetaData()->scriptClass))
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::Texture2DRef;
 				return typeInfo;
 			}
-			if (monoClass->isSubClassOf(mTexture3DClass))
+			if (monoClass->isSubClassOf(ScriptTexture3D::getMetaData()->scriptClass))
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::Texture3DRef;
 				return typeInfo;
 			}
-			if (monoClass->isSubClassOf(mTextureCubeClass))
+			if (monoClass->isSubClassOf(ScriptTextureCube::getMetaData()->scriptClass))
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::TextureCubeRef;
 				return typeInfo;
 			}
-			else if(monoClass->isSubClassOf(mSpriteTextureClass))
+			else if (monoClass->isSubClassOf(ScriptSpriteTexture::getMetaData()->scriptClass))
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::SpriteTextureRef;
 				return typeInfo;
 			}
-			else if (monoClass->isSubClassOf(mManagedResourceClass))
+			else if (monoClass->isSubClassOf(ScriptManagedResource::getMetaData()->scriptClass))
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::ManagedResourceRef;
 				return typeInfo;
 			}
-			else if (monoClass->isSubClassOf(mShaderClass))
+			else if (monoClass->isSubClassOf(ScriptShader::getMetaData()->scriptClass))
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::ShaderRef;
 				return typeInfo;
 			}
-			else if (monoClass->isSubClassOf(mMaterialClass))
+			else if (monoClass->isSubClassOf(ScriptMaterial::getMetaData()->scriptClass))
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::MaterialRef;
 				return typeInfo;
 			}
-			else if (monoClass->isSubClassOf(mMeshClass))
+			else if (monoClass->isSubClassOf(ScriptMesh::getMetaData()->scriptClass))
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::MeshRef;
 				return typeInfo;
 			}
-			else if (monoClass->isSubClassOf(mPlainTextClass))
+			else if (monoClass->isSubClassOf(ScriptPlainText::getMetaData()->scriptClass))
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::PlainTextRef;
 				return typeInfo;
 			}
-			else if (monoClass->isSubClassOf(mScriptCodeClass))
+			else if (monoClass->isSubClassOf(ScriptScriptCode::getMetaData()->scriptClass))
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::ScriptCodeRef;
 				return typeInfo;
 			}
-			else if (monoClass->isSubClassOf(mPrefabClass))
+			else if (monoClass->isSubClassOf(ScriptPrefab::getMetaData()->scriptClass))
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::PrefabRef;
 				return typeInfo;
 			}
-			else if (monoClass->isSubClassOf(mStringTableClass))
+			else if (monoClass->isSubClassOf(ScriptFont::getMetaData()->scriptClass))
+			{
+				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
+				typeInfo->mType = ScriptPrimitiveType::FontRef;
+				return typeInfo;
+			}
+			else if (monoClass->isSubClassOf(ScriptStringTable::getMetaData()->scriptClass))
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::StringTableRef;
@@ -433,20 +451,6 @@ namespace BansheeEngine
 		mSceneObjectClass = nullptr;
 		mMissingComponentClass = nullptr;
 
-		mManagedResourceClass = nullptr;
-		mTexture2DClass = nullptr;
-		mTexture3DClass = nullptr;
-		mTextureCubeClass = nullptr;
-		mSpriteTextureClass = nullptr;
-		mShaderClass = nullptr;
-		mMaterialClass = nullptr;
-		mMeshClass = nullptr;
-		mPrefabClass = nullptr;
-		mStringTableClass = nullptr;
-		mFontClass = nullptr;
-		mPlainTextClass = nullptr;
-		mScriptCodeClass = nullptr;
-
 		mSerializeFieldAttribute = nullptr;
 		mHideInInspectorAttribute = nullptr;
 	}
@@ -494,58 +498,6 @@ namespace BansheeEngine
 		if(mSceneObjectClass == nullptr)
 			BS_EXCEPT(InvalidStateException, "Cannot find SceneObject managed class.");
 
-		mManagedResourceClass = bansheeEngineAssembly->getClass("BansheeEngine", "ManagedResource");
-		if (mManagedResourceClass == nullptr)
-			BS_EXCEPT(InvalidStateException, "Cannot find ManagedResource managed class.");
-
-		mTexture2DClass = bansheeEngineAssembly->getClass("BansheeEngine", "Texture2D");
-		if(mTexture2DClass == nullptr)
-			BS_EXCEPT(InvalidStateException, "Cannot find Texture2D managed class.");
-
-		mTexture3DClass = bansheeEngineAssembly->getClass("BansheeEngine", "Texture3D");
-		if (mTexture3DClass == nullptr)
-			BS_EXCEPT(InvalidStateException, "Cannot find Texture3D managed class.");
-
-		mTextureCubeClass = bansheeEngineAssembly->getClass("BansheeEngine", "TextureCube");
-		if (mTextureCubeClass == nullptr)
-			BS_EXCEPT(InvalidStateException, "Cannot find TextureCube managed class.");
-
-		mSpriteTextureClass = bansheeEngineAssembly->getClass("BansheeEngine", "SpriteTexture");
-		if(mSpriteTextureClass == nullptr)
-			BS_EXCEPT(InvalidStateException, "Cannot find SpriteTexture managed class.");
-
-		mShaderClass = bansheeEngineAssembly->getClass("BansheeEngine", "Shader");
-		if (mShaderClass == nullptr)
-			BS_EXCEPT(InvalidStateException, "Cannot find Shader managed class.");
-
-		mMaterialClass = bansheeEngineAssembly->getClass("BansheeEngine", "Material");
-		if (mMaterialClass == nullptr)
-			BS_EXCEPT(InvalidStateException, "Cannot find Material managed class.");
-
-		mMeshClass = bansheeEngineAssembly->getClass("BansheeEngine", "Mesh");
-		if (mMeshClass == nullptr)
-			BS_EXCEPT(InvalidStateException, "Cannot find Mesh managed class.");
-
-		mFontClass = bansheeEngineAssembly->getClass("BansheeEngine", "Font");
-		if (mFontClass == nullptr)
-			BS_EXCEPT(InvalidStateException, "Cannot find Font managed class.");
-
-		mPrefabClass = bansheeEngineAssembly->getClass("BansheeEngine", "Prefab");
-		if (mPrefabClass == nullptr)
-			BS_EXCEPT(InvalidStateException, "Cannot find Prefab managed class.");
-
-		mStringTableClass = bansheeEngineAssembly->getClass("BansheeEngine", "StringTable");
-		if (mStringTableClass == nullptr)
-			BS_EXCEPT(InvalidStateException, "Cannot find StringTable managed class.");
-
-		mPlainTextClass = bansheeEngineAssembly->getClass("BansheeEngine", "PlainText");
-		if (mPlainTextClass == nullptr)
-			BS_EXCEPT(InvalidStateException, "Cannot find PlainText managed class.");
-
-		mScriptCodeClass = bansheeEngineAssembly->getClass("BansheeEngine", "ScriptCode");
-		if (mScriptCodeClass == nullptr)
-			BS_EXCEPT(InvalidStateException, "Cannot find ScriptCode managed class.");
-
 		mSerializeFieldAttribute = bansheeEngineAssembly->getClass("BansheeEngine", "SerializeField");
 		if(mSerializeFieldAttribute == nullptr)
 			BS_EXCEPT(InvalidStateException, "Cannot find SerializeField managed class.");

+ 4 - 6
SBansheeEngine/Source/BsScriptBuiltin.cpp

@@ -24,9 +24,8 @@ namespace BansheeEngine
 	{
 		HSpriteTexture whiteTexture = BuiltinResources::instance().getWhiteSpriteTexture();
 
-		ScriptSpriteTexture* scriptSpriteTex = ScriptResourceManager::instance().getScriptSpriteTexture(whiteTexture);
-		if (scriptSpriteTex == nullptr)
-			scriptSpriteTex = ScriptResourceManager::instance().createScriptSpriteTexture(whiteTexture);
+		ScriptSpriteTexture* scriptSpriteTex;
+		ScriptResourceManager::instance().getScriptResource(whiteTexture, &scriptSpriteTex, true);
 
 		return scriptSpriteTex->getManagedInstance();
 	}
@@ -35,9 +34,8 @@ namespace BansheeEngine
 	{
 		HShader diffuseShader = BuiltinResources::instance().getDiffuseShader();
 
-		ScriptShader* scriptShader = ScriptResourceManager::instance().getScriptShader(diffuseShader);
-		if (scriptShader == nullptr)
-			scriptShader = ScriptResourceManager::instance().createScriptShader(diffuseShader);
+		ScriptShader* scriptShader;
+		ScriptResourceManager::instance().getScriptResource(diffuseShader, &scriptShader, true);
 
 		return scriptShader->getManagedInstance();
 	}

+ 11 - 13
SBansheeEngine/Source/BsScriptMaterial.cpp

@@ -59,7 +59,9 @@ namespace BansheeEngine
 			nativeShader = BuiltinResources::instance().getDummyShader();
 
 		HMaterial material = Material::create(nativeShader);
-		ScriptResourceManager::instance().createScriptMaterial(instance, material);
+
+		ScriptMaterial* scriptInstance;
+		ScriptResourceManager::instance().createScriptResource(instance, material, &scriptInstance);
 	}
 
 	MonoObject* ScriptMaterial::internal_GetShader(ScriptMaterial* nativeInstance)
@@ -69,9 +71,8 @@ namespace BansheeEngine
 		if (shader == nullptr)
 			return nullptr;
 
-		ScriptShader* scriptShader = ScriptResourceManager::instance().getScriptShader(shader);
-		if (scriptShader == nullptr)
-			scriptShader = ScriptResourceManager::instance().createScriptShader(shader);
+		ScriptShader* scriptShader;
+		ScriptResourceManager::instance().getScriptResource(shader, &scriptShader, true);
 
 		return scriptShader->getManagedInstance();
 	}
@@ -230,9 +231,8 @@ namespace BansheeEngine
 		if (texture == nullptr)
 			return nullptr;
 
-		ScriptTexture2D* scriptTexture = ScriptResourceManager::instance().getScriptTexture2D(texture);
-		if (scriptTexture == nullptr)
-			scriptTexture = ScriptResourceManager::instance().createScriptTexture2D(texture);
+		ScriptTexture2D* scriptTexture;
+		ScriptResourceManager::instance().getScriptResource(texture, &scriptTexture, true);
 
 		return scriptTexture->getManagedInstance();
 	}
@@ -245,9 +245,8 @@ namespace BansheeEngine
 		if (texture == nullptr)
 			return nullptr;
 
-		ScriptTexture3D* scriptTexture = ScriptResourceManager::instance().getScriptTexture3D(texture);
-		if (scriptTexture == nullptr)
-			scriptTexture = ScriptResourceManager::instance().createScriptTexture3D(texture);
+		ScriptTexture3D* scriptTexture;
+		ScriptResourceManager::instance().getScriptResource(texture, &scriptTexture, true);
 
 		return scriptTexture->getManagedInstance();
 	}
@@ -260,9 +259,8 @@ namespace BansheeEngine
 		if (texture == nullptr)
 			return nullptr;
 
-		ScriptTextureCube* scriptTexture = ScriptResourceManager::instance().getScriptTextureCube(texture);
-		if (scriptTexture == nullptr)
-			scriptTexture = ScriptResourceManager::instance().createScriptTextureCube(texture);
+		ScriptTextureCube* scriptTexture;
+		ScriptResourceManager::instance().getScriptResource(texture, &scriptTexture, true);
 
 		return scriptTexture->getManagedInstance();
 	}

+ 4 - 2
SBansheeEngine/Source/BsScriptMesh.cpp

@@ -57,7 +57,8 @@ namespace BansheeEngine
 		Vector<SubMesh> nativeSubMeshes = monoToNativeSubMeshes(subMeshes);
 		HMesh mesh = Mesh::create(numVertices, numIndices, vertexDesc, nativeSubMeshes, usage, indexType);
 
-		ScriptResourceManager::instance().createScriptMesh(instance, mesh);
+		ScriptMesh* scriptInstance;
+		ScriptResourceManager::instance().createScriptResource(instance, mesh, &scriptInstance);
 	}
 
 	void ScriptMesh::internal_CreateInstanceMeshData(MonoObject* instance, ScriptMeshData* data, MonoArray* subMeshes,
@@ -70,7 +71,8 @@ namespace BansheeEngine
 		Vector<SubMesh> nativeSubMeshes = monoToNativeSubMeshes(subMeshes);
 		HMesh mesh = Mesh::create(meshData, nativeSubMeshes, usage);
 
-		ScriptResourceManager::instance().createScriptMesh(instance, mesh);
+		ScriptMesh* scriptInstance;
+		ScriptResourceManager::instance().createScriptResource(instance, mesh, &scriptInstance);
 	}
 
 	MonoArray* ScriptMesh::internal_GetSubMeshes(ScriptMesh* thisPtr)

+ 2 - 1
SBansheeEngine/Source/BsScriptPlainText.cpp

@@ -29,7 +29,8 @@ namespace BansheeEngine
 		WString strText = MonoUtil::monoToWString(text);
 		HPlainText plainText = PlainText::create(strText);
 
-		ScriptResourceManager::instance().createScriptPlainText(instance, plainText);
+		ScriptPlainText* scriptInstance;
+		ScriptResourceManager::instance().createScriptResource(instance, plainText, &scriptInstance);
 	}
 
 	MonoString* ScriptPlainText::internal_getText(ScriptPlainText* thisPtr)

+ 2 - 1
SBansheeEngine/Source/BsScriptPrefab.cpp

@@ -27,7 +27,8 @@ namespace BansheeEngine
 	{
 		HPrefab prefab = Prefab::create(so->getNativeSceneObject());
 
-		ScriptResourceManager::instance().createScriptPrefab(instance, prefab);
+		ScriptPrefab* scriptInstance;
+		ScriptResourceManager::instance().createScriptResource(instance, prefab, &scriptInstance);
 	}
 
 	MonoObject* ScriptPrefab::internal_GetRoot(ScriptPrefab* thisPtr)

+ 6 - 9
SBansheeEngine/Source/BsScriptRenderTexture2D.cpp

@@ -149,9 +149,8 @@ namespace BansheeEngine
 			{
 				HTexture colorTex = tex->getBindableColorTexture(i);
 
-				ScriptTexture2D* scriptSurface = ScriptResourceManager::instance().getScriptTexture2D(colorTex);
-				if (scriptSurface == nullptr)
-					scriptSurface = ScriptResourceManager::instance().createScriptTexture2D(colorTex);
+				ScriptTexture2D* scriptSurface;
+				ScriptResourceManager::instance().getScriptResource(colorTex, &scriptSurface, true);
 
 				outArray.set(i, scriptSurface->getManagedInstance());
 				*value = outArray.getInternal();
@@ -164,9 +163,8 @@ namespace BansheeEngine
 
 			HTexture colorTex = tex->getBindableColorTexture();
 
-			ScriptTexture2D* scriptSurface = ScriptResourceManager::instance().getScriptTexture2D(colorTex);
-			if (scriptSurface == nullptr)
-				scriptSurface = ScriptResourceManager::instance().createScriptTexture2D(colorTex);
+			ScriptTexture2D* scriptSurface;
+			ScriptResourceManager::instance().getScriptResource(colorTex, &scriptSurface, true);
 
 			outArray.set(0, scriptSurface->getManagedInstance());
 			*value = outArray.getInternal();
@@ -187,9 +185,8 @@ namespace BansheeEngine
 			colorTex = tex->getBindableDepthStencilTexture();
 		}
 
-		ScriptTexture2D* scriptSurface = ScriptResourceManager::instance().getScriptTexture2D(colorTex);
-		if (scriptSurface == nullptr)
-			scriptSurface = ScriptResourceManager::instance().createScriptTexture2D(colorTex);
+		ScriptTexture2D* scriptSurface;
+		ScriptResourceManager::instance().getScriptResource(colorTex, &scriptSurface, true);
 
 		*value = scriptSurface->getManagedInstance();
 	}

+ 92 - 330
SBansheeEngine/Source/BsScriptResourceManager.cpp

@@ -23,383 +23,91 @@ namespace BansheeEngine
 	{
 	}
 
-	ScriptTexture2D* ScriptResourceManager::createScriptTexture2D(const HTexture& resourceHandle)
+	template<class RetType, class InType>
+	void ScriptResourceManager::createScriptResource(const ResourceHandle<InType>& resourceHandle, RetType** out)
 	{
-		MonoClass* textureClass = ScriptAssemblyManager::instance().getTexture2DClass();
-		MonoObject* monoInstance = textureClass->createInstance();
+		MonoClass* resourceClass = RetType::getMetaData()->scriptClass;
+		MonoObject* monoInstance = resourceClass->createInstance();
 
-		return createScriptTexture2D(monoInstance, resourceHandle);
+		createScriptResource(monoInstance, resourceHandle, out);
 	}
 
-	ScriptTexture3D* ScriptResourceManager::createScriptTexture3D(const HTexture& resourceHandle)
-	{
-		MonoClass* textureClass = ScriptAssemblyManager::instance().getTexture3DClass();
-		MonoObject* monoInstance = textureClass->createInstance();
-
-		return createScriptTexture3D(monoInstance, resourceHandle);
-	}
-
-	ScriptTextureCube* ScriptResourceManager::createScriptTextureCube(const HTexture& resourceHandle)
-	{
-		MonoClass* textureClass = ScriptAssemblyManager::instance().getTextureCubeClass();
-		MonoObject* monoInstance = textureClass->createInstance();
-
-		return createScriptTextureCube(monoInstance, resourceHandle);
-	}
-
-	ScriptTexture2D* ScriptResourceManager::createScriptTexture2D(MonoObject* instance, const HTexture& resourceHandle)
-	{
-		const String& uuid = resourceHandle.getUUID();
-#if BS_DEBUG_MODE
-		throwExceptionIfInvalidOrDuplicate(uuid);
-#endif
-
-		ScriptTexture2D* scriptResource = new (bs_alloc<ScriptTexture2D>()) ScriptTexture2D(instance, resourceHandle);
-		mScriptResources[uuid] = scriptResource;
-
-		return scriptResource;
-	}
-
-	ScriptTexture3D* ScriptResourceManager::createScriptTexture3D(MonoObject* instance, const HTexture& resourceHandle)
-	{
-		const String& uuid = resourceHandle.getUUID();
-#if BS_DEBUG_MODE
-		throwExceptionIfInvalidOrDuplicate(uuid);
-#endif
-
-		ScriptTexture3D* scriptResource = new (bs_alloc<ScriptTexture3D>()) ScriptTexture3D(instance, resourceHandle);
-		mScriptResources[uuid] = scriptResource;
-
-		return scriptResource;
-	}
-
-	ScriptTextureCube* ScriptResourceManager::createScriptTextureCube(MonoObject* instance, const HTexture& resourceHandle)
-	{
-		const String& uuid = resourceHandle.getUUID();
-#if BS_DEBUG_MODE
-		throwExceptionIfInvalidOrDuplicate(uuid);
-#endif
-
-		ScriptTextureCube* scriptResource = new (bs_alloc<ScriptTextureCube>()) ScriptTextureCube(instance, resourceHandle);
-		mScriptResources[uuid] = scriptResource;
-
-		return scriptResource;
-	}
-
-	ScriptShader* ScriptResourceManager::createScriptShader(const HShader& resourceHandle)
-	{
-		MonoClass* shaderClass = ScriptAssemblyManager::instance().getShaderClass();
-		MonoObject* monoInstance = shaderClass->createInstance();
-
-		return createScriptShader(monoInstance, resourceHandle);
-	}
-
-	ScriptShader* ScriptResourceManager::createScriptShader(MonoObject* instance, const HShader& resourceHandle)
-	{
-		const String& uuid = resourceHandle.getUUID();
-#if BS_DEBUG_MODE
-		throwExceptionIfInvalidOrDuplicate(uuid);
-#endif
-
-		ScriptShader* scriptResource = new (bs_alloc<ScriptShader>()) ScriptShader(instance, resourceHandle);
-		mScriptResources[uuid] = scriptResource;
-
-		return scriptResource;
-	}
-
-	ScriptMaterial* ScriptResourceManager::createScriptMaterial(const HMaterial& resourceHandle)
-	{
-		MonoClass* materialClass = ScriptAssemblyManager::instance().getMaterialClass();
-		MonoObject* monoInstance = materialClass->createInstance();
-
-		return createScriptMaterial(monoInstance, resourceHandle);
-	}
-
-	ScriptMaterial* ScriptResourceManager::createScriptMaterial(MonoObject* instance, const HMaterial& resourceHandle)
-	{
-		const String& uuid = resourceHandle.getUUID();
-#if BS_DEBUG_MODE
-		throwExceptionIfInvalidOrDuplicate(uuid);
-#endif
-
-		ScriptMaterial* scriptResource = new (bs_alloc<ScriptMaterial>()) ScriptMaterial(instance, resourceHandle);
-		mScriptResources[uuid] = scriptResource;
-
-		return scriptResource;
-	}
-
-	ScriptMesh* ScriptResourceManager::createScriptMesh(const HMesh& resourceHandle)
-	{
-		MonoClass* meshClass = ScriptAssemblyManager::instance().getMeshClass();
-		MonoObject* monoInstance = meshClass->createInstance();
-
-		return createScriptMesh(monoInstance, resourceHandle);
-	}
-
-	ScriptMesh* ScriptResourceManager::createScriptMesh(MonoObject* instance, const HMesh& resourceHandle)
-	{
-		const String& uuid = resourceHandle.getUUID();
-#if BS_DEBUG_MODE
-		throwExceptionIfInvalidOrDuplicate(uuid);
-#endif
-
-		ScriptMesh* scriptResource = new (bs_alloc<ScriptMesh>()) ScriptMesh(instance, resourceHandle);
-		mScriptResources[uuid] = scriptResource;
-
-		return scriptResource;
-	}
-
-	ScriptPlainText* ScriptResourceManager::createScriptPlainText(const HPlainText& resourceHandle)
-	{
-		MonoClass* plainTextClass = ScriptAssemblyManager::instance().getPlainTextClass();
-		MonoObject* monoInstance = plainTextClass->createInstance();
-
-		return createScriptPlainText(monoInstance, resourceHandle);
-	}
-
-	ScriptPlainText* ScriptResourceManager::createScriptPlainText(MonoObject* instance, const HPlainText& resourceHandle)
-	{
-		const String& uuid = resourceHandle.getUUID();
-#if BS_DEBUG_MODE
-		throwExceptionIfInvalidOrDuplicate(uuid);
-#endif
-
-		ScriptPlainText* scriptResource = new (bs_alloc<ScriptPlainText>()) ScriptPlainText(instance, resourceHandle);
-		mScriptResources[uuid] = scriptResource;
-
-		return scriptResource;
-	}
-
-	ScriptScriptCode* ScriptResourceManager::createScriptScriptCode(const HScriptCode& resourceHandle)
-	{
-		MonoClass* scriptCodeClass = ScriptAssemblyManager::instance().getScriptCodeClass();
-		MonoObject* monoInstance = scriptCodeClass->createInstance();
-
-		return createScriptScriptCode(monoInstance, resourceHandle);
-	}
-
-	ScriptScriptCode* ScriptResourceManager::createScriptScriptCode(MonoObject* instance, const HScriptCode& resourceHandle)
-	{
-		const String& uuid = resourceHandle.getUUID();
-#if BS_DEBUG_MODE
-		throwExceptionIfInvalidOrDuplicate(uuid);
-#endif
-
-		ScriptScriptCode* scriptResource = new (bs_alloc<ScriptScriptCode>()) ScriptScriptCode(instance, resourceHandle);
-		mScriptResources[uuid] = scriptResource;
-
-		return scriptResource;
-	}
-
-	ScriptSpriteTexture* ScriptResourceManager::createScriptSpriteTexture(const HSpriteTexture& resourceHandle)
-	{
-		MonoClass* spriteTextureClass = ScriptAssemblyManager::instance().getSpriteTextureClass();
-		MonoObject* monoInstance = spriteTextureClass->createInstance();
-
-		return createScriptSpriteTexture(monoInstance, resourceHandle);
-	}
-
-	ScriptSpriteTexture* ScriptResourceManager::createScriptSpriteTexture(MonoObject* instance, const HSpriteTexture& resourceHandle)
+	template<class RetType, class InType>
+	void ScriptResourceManager::createScriptResource(MonoObject* instance, const ResourceHandle<InType>& resourceHandle, RetType** out)
 	{
 		const String& uuid = resourceHandle.getUUID();
 #if BS_DEBUG_MODE
 		throwExceptionIfInvalidOrDuplicate(uuid);
 #endif
 
-		ScriptSpriteTexture* scriptResource = new (bs_alloc<ScriptSpriteTexture>()) ScriptSpriteTexture(instance, resourceHandle);
+		RetType* scriptResource = new (bs_alloc<RetType>()) RetType(instance, resourceHandle);
 		mScriptResources[uuid] = scriptResource;
 
-		return scriptResource;
+		*out = scriptResource;
 	}
 
-	ScriptFont* ScriptResourceManager::createScriptFont(const HFont& resourceHandle)
+	template<class RetType, class InType>
+	void ScriptResourceManager::getScriptResource(const ResourceHandle<InType>& resourceHandle, RetType** out, bool create)
 	{
-		MonoClass* fontClass = ScriptAssemblyManager::instance().getFontClass();
-		MonoObject* monoInstance = fontClass->createInstance();
+		*out = static_cast<RetType*>(getScriptResource(resourceHandle.getUUID()));
 
-		return createScriptFont(monoInstance, resourceHandle);
+		if (*out == nullptr && create)
+			createScriptResource(resourceHandle, out);
 	}
 
-	ScriptFont* ScriptResourceManager::createScriptFont(MonoObject* instance, const HFont& resourceHandle)
+	template<>
+	void ScriptResourceManager::createScriptResource(const ResourceHandle<StringTable>& resourceHandle, ScriptStringTable** out)
 	{
-		const String& uuid = resourceHandle.getUUID();
-#if BS_DEBUG_MODE
-		throwExceptionIfInvalidOrDuplicate(uuid);
-#endif
-
-		ScriptFont* scriptResource = new (bs_alloc<ScriptFont>()) ScriptFont(instance, resourceHandle);
-		mScriptResources[uuid] = scriptResource;
-
-		return scriptResource;
-	}
-
-	ScriptPrefab* ScriptResourceManager::createScriptPrefab(const HPrefab& resourceHandle)
-	{
-		MonoClass* prefabClass = ScriptAssemblyManager::instance().getPrefabClass();
-		MonoObject* monoInstance = prefabClass->createInstance();
-
-		return createScriptPrefab(monoInstance, resourceHandle);
-	}
-
-	ScriptPrefab* ScriptResourceManager::createScriptPrefab(MonoObject* instance, const HPrefab& resourceHandle)
-	{
-		const String& uuid = resourceHandle.getUUID();
-#if BS_DEBUG_MODE
-		throwExceptionIfInvalidOrDuplicate(uuid);
-#endif
-
-		ScriptPrefab* scriptResource = new (bs_alloc<ScriptPrefab>()) ScriptPrefab(instance, resourceHandle);
-		mScriptResources[uuid] = scriptResource;
-
-		return scriptResource;
-	}
+		MonoClass* resourceClass = ScriptStringTable::getMetaData()->scriptClass;
 
-	ScriptStringTable* ScriptResourceManager::createScriptStringTable(const HStringTable& resourceHandle)
-	{
-		MonoClass* stringTableClass = ScriptAssemblyManager::instance().getStringTableClass();
-		MonoObject* monoInstance = stringTableClass->createInstance();
+		bool dummy = true;
+		void* params = { &dummy };
 
-		// Managed constructor will call ::create(MonoObject*, const HStringTable&) internally so we just need
-		// to retrieve the created object
-		return ScriptStringTable::toNative(monoInstance);
+		MonoObject* monoInstance = resourceClass->createInstance(&params, 1);
+		createScriptResource(monoInstance, resourceHandle, out);
 	}
 
-	ScriptStringTable* ScriptResourceManager::createScriptStringTable(MonoObject* instance, const HStringTable& resourceHandle)
+	template<>
+	void ScriptResourceManager::createScriptResource(const HResource& resourceHandle, ScriptResourceBase** out)
 	{
-		const String& uuid = resourceHandle.getUUID();
 #if BS_DEBUG_MODE
-		throwExceptionIfInvalidOrDuplicate(uuid);
+		throwExceptionIfInvalidOrDuplicate(resourceHandle.getUUID());
 #endif
 
-		ScriptStringTable* scriptResource = new (bs_alloc<ScriptStringTable>()) ScriptStringTable(instance, resourceHandle);
-		mScriptResources[uuid] = scriptResource;
-
-		return scriptResource;
-	}
-
-	ScriptManagedResource* ScriptResourceManager::createManagedResource(MonoObject* existingInstance, const HManagedResource& resourceHandle)
-	{
-		const String& uuid = resourceHandle.getUUID();
-		throwExceptionIfInvalidOrDuplicate(uuid);
-
-		ScriptManagedResource* scriptResource = new (bs_alloc<ScriptManagedResource>()) ScriptManagedResource(existingInstance, resourceHandle);
-		mScriptResources[uuid] = scriptResource;
-
-		return scriptResource;
-	}
-
-	ScriptTexture2D* ScriptResourceManager::getScriptTexture2D(const HTexture& resourceHandle)
-	{
-		return static_cast<ScriptTexture2D*>(getScriptResource(resourceHandle.getUUID()));
-	}
-
-	ScriptTexture3D* ScriptResourceManager::getScriptTexture3D(const HTexture& resourceHandle)
-	{
-		return static_cast<ScriptTexture3D*>(getScriptResource(resourceHandle.getUUID()));
-	}
-
-	ScriptTextureCube* ScriptResourceManager::getScriptTextureCube(const HTexture& resourceHandle)
-	{
-		return static_cast<ScriptTextureCube*>(getScriptResource(resourceHandle.getUUID()));
-	}
-
-	ScriptSpriteTexture* ScriptResourceManager::getScriptSpriteTexture(const HSpriteTexture& resourceHandle)
-	{
-		return static_cast<ScriptSpriteTexture*>(getScriptResource(resourceHandle.getUUID()));
-	}
-
-	ScriptShader* ScriptResourceManager::getScriptShader(const HShader& resourceHandle)
-	{
-		return static_cast<ScriptShader*>(getScriptResource(resourceHandle.getUUID()));
-	}
-
-	ScriptMaterial* ScriptResourceManager::getScriptMaterial(const HMaterial& resourceHandle)
-	{
-		return static_cast<ScriptMaterial*>(getScriptResource(resourceHandle.getUUID()));
-	}
-
-	ScriptMesh* ScriptResourceManager::getScriptMesh(const HMesh& resourceHandle)
-	{
-		return static_cast<ScriptMesh*>(getScriptResource(resourceHandle.getUUID()));
-	}
-
-	ScriptPlainText* ScriptResourceManager::getScriptPlainText(const HPlainText& resourceHandle)
-	{
-		return static_cast<ScriptPlainText*>(getScriptResource(resourceHandle.getUUID()));
-	}
-
-	ScriptScriptCode* ScriptResourceManager::getScriptScriptCode(const HScriptCode& resourceHandle)
-	{
-		return static_cast<ScriptScriptCode*>(getScriptResource(resourceHandle.getUUID()));
-	}
-
-	ScriptManagedResource* ScriptResourceManager::getScriptManagedResource(const HManagedResource& resourceHandle)
-	{
-		return static_cast<ScriptManagedResource*>(getScriptResource(resourceHandle.getUUID()));
-	}
-
-	ScriptPrefab* ScriptResourceManager::getScriptPrefab(const HPrefab& resourceHandle)
-	{
-		return static_cast<ScriptPrefab*>(getScriptResource(resourceHandle.getUUID()));
-	}
-
-	ScriptStringTable* ScriptResourceManager::getScriptStringTable(const HStringTable& resourceHandle)
-	{
-		return static_cast<ScriptStringTable*>(getScriptResource(resourceHandle.getUUID()));
-	}
-
-	ScriptResourceBase* ScriptResourceManager::getScriptResource(const String& uuid)
-	{
-		if(uuid == "")
-			BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
-
-		auto findIter = mScriptResources.find(uuid);
-		if(findIter != mScriptResources.end())
-			return findIter->second;
-
-		return nullptr;
-	}
-
-	ScriptResourceBase* ScriptResourceManager::createScriptResource(const HResource& resource)
-	{
-#if BS_DEBUG_MODE
-		throwExceptionIfInvalidOrDuplicate(resource.getUUID());
-#endif
-
-		UINT32 resTypeID = resource->getTypeId();
+		UINT32 resTypeID = resourceHandle->getTypeId();
 
 		switch (resTypeID)
 		{
 		case TID_Texture:
 		{
-			HTexture texture = static_resource_cast<Texture>(resource);
+			HTexture texture = static_resource_cast<Texture>(resourceHandle);
 			TextureType type = texture->getProperties().getTextureType();
 
 			if (type == TEX_TYPE_3D)
-				return createScriptTexture3D(texture);
+				return createScriptResource(texture, (ScriptTexture3D**)out);
 			else if (type == TEX_TYPE_CUBE_MAP)
-				return createScriptTextureCube(texture);
+				return createScriptResource(texture, (ScriptTextureCube**)out);
 			else
-				return createScriptTexture2D(texture);
+				return createScriptResource(texture, (ScriptTexture2D**)out);
 		}
 		case TID_SpriteTexture:
-			return createScriptSpriteTexture(static_resource_cast<SpriteTexture>(resource));
+			return createScriptResource(static_resource_cast<SpriteTexture>(resourceHandle), (ScriptSpriteTexture**)out);
 		case TID_Font:
-			return createScriptFont(static_resource_cast<Font>(resource));
+			return createScriptResource(static_resource_cast<Font>(resourceHandle), (ScriptFont**)out);
 		case TID_PlainText:
-			return createScriptPlainText(static_resource_cast<PlainText>(resource));
+			return createScriptResource(static_resource_cast<PlainText>(resourceHandle), (ScriptPlainText**)out);
 		case TID_ScriptCode:
-			return createScriptScriptCode(static_resource_cast<ScriptCode>(resource));
+			return createScriptResource(static_resource_cast<ScriptCode>(resourceHandle), (ScriptScriptCode**)out);
 		case TID_Shader:
-			return createScriptShader(static_resource_cast<Shader>(resource));
+			return createScriptResource(static_resource_cast<Shader>(resourceHandle), (ScriptShader**)out);
 		case TID_Prefab:
-			return createScriptPrefab(static_resource_cast<Prefab>(resource));
+			return createScriptResource(static_resource_cast<Prefab>(resourceHandle), (ScriptPrefab**)out);
 		case TID_StringTable:
-			return createScriptStringTable(static_resource_cast<StringTable>(resource));
+			return createScriptResource(static_resource_cast<StringTable>(resourceHandle), (ScriptStringTable**)out);
 		case TID_Material:
-			return createScriptMaterial(static_resource_cast<Material>(resource));
+			return createScriptResource(static_resource_cast<Material>(resourceHandle), (ScriptMaterial**)out);
 		case TID_Mesh:
-			return createScriptMesh(static_resource_cast<Mesh>(resource));
+			return createScriptResource(static_resource_cast<Mesh>(resourceHandle), (ScriptMesh**)out);
 		case TID_ManagedResource:
 			BS_EXCEPT(InternalErrorException, "Managed resources must have a managed instance by default, this call is invalid.")
 				break;
@@ -409,6 +117,60 @@ namespace BansheeEngine
 		}
 	}
 
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Texture>&, ScriptTexture2D**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Texture>&, ScriptTexture3D**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Texture>&, ScriptTextureCube**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<SpriteTexture>&, ScriptSpriteTexture**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Mesh>&, ScriptMesh**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Material>&, ScriptMaterial**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Shader>&, ScriptShader**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Prefab>&, ScriptPrefab**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Font>&, ScriptFont**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<PlainText>&, ScriptPlainText**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<ScriptCode>&, ScriptScriptCode**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<StringTable>&, ScriptStringTable**);
+
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Texture>&, ScriptTexture2D**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Texture>&, ScriptTexture3D**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Texture>&, ScriptTextureCube**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<SpriteTexture>&, ScriptSpriteTexture**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Mesh>&, ScriptMesh**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Material>&, ScriptMaterial**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Shader>&, ScriptShader**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Prefab>&, ScriptPrefab**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Font>&, ScriptFont**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<PlainText>&, ScriptPlainText**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<ScriptCode>&, ScriptScriptCode**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<StringTable>&, ScriptStringTable**);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<ManagedResource>&, ScriptManagedResource**);
+	
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Texture>& resourceHandle, ScriptTexture2D** out, bool create);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Texture>& resourceHandle, ScriptTexture3D** out, bool create);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Texture>& resourceHandle, ScriptTextureCube** out, bool create);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<SpriteTexture>& resourceHandle, ScriptSpriteTexture** out, bool create);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Mesh>& resourceHandle, ScriptMesh** out, bool create);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Material>& resourceHandle, ScriptMaterial** out, bool create);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Shader>& resourceHandle, ScriptShader** out, bool create);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Prefab>& resourceHandle, ScriptPrefab** out, bool create);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Font>& resourceHandle, ScriptFont** out, bool create);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<PlainText>& resourceHandle, ScriptPlainText** out, bool create);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<ScriptCode>& resourceHandle, ScriptScriptCode** out, bool create);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<StringTable>& resourceHandle, ScriptStringTable** out, bool create);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<ManagedResource>& resourceHandle, ScriptManagedResource** out, bool create);
+	template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Resource>& resourceHandle, ScriptResourceBase** out, bool create);
+
+	ScriptResourceBase* ScriptResourceManager::getScriptResource(const String& uuid)
+	{
+		if(uuid == "")
+			BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
+
+		auto findIter = mScriptResources.find(uuid);
+		if(findIter != mScriptResources.end())
+			return findIter->second;
+
+		return nullptr;
+	}
+
 	void ScriptResourceManager::destroyScriptResource(ScriptResourceBase* resource)
 	{
 		HResource resourceHandle = resource->getNativeHandle();

+ 2 - 1
SBansheeEngine/Source/BsScriptScriptCode.cpp

@@ -28,7 +28,8 @@ namespace BansheeEngine
 		WString strText = MonoUtil::monoToWString(text);
 		HScriptCode scriptCode = ScriptCode::create(strText);
 
-		ScriptResourceManager::instance().createScriptScriptCode(instance, scriptCode);
+		ScriptScriptCode* scriptInstance;
+		ScriptResourceManager::instance().createScriptResource(instance, scriptCode, &scriptInstance);
 	}
 
 	MonoString* ScriptScriptCode::internal_getText(ScriptScriptCode* thisPtr)

+ 5 - 5
SBansheeEngine/Source/BsScriptSpriteTexture.cpp

@@ -23,16 +23,17 @@ namespace BansheeEngine
 	void ScriptSpriteTexture::internal_createInstance(MonoObject* instance, MonoObject* texture, Vector2 offset, Vector2 scale)
 	{
 		ScriptTexture2D* scriptTexture = ScriptTexture2D::toNative(texture);
+		ScriptSpriteTexture* scriptInstance;
 
 		if (scriptTexture == nullptr)
 		{
-			ScriptResourceManager::instance().createScriptSpriteTexture(instance, SpriteTexture::dummy());
+			ScriptResourceManager::instance().createScriptResource(instance, SpriteTexture::dummy(), &scriptInstance);
 		}
 		else
 		{
 			HSpriteTexture spriteTexture = SpriteTexture::create(offset, scale, static_resource_cast<Texture>(scriptTexture->getNativeHandle()));
 
-			ScriptResourceManager::instance().createScriptSpriteTexture(instance, spriteTexture);
+			ScriptResourceManager::instance().createScriptResource(instance, spriteTexture, &scriptInstance);
 		}
 	}
 
@@ -54,9 +55,8 @@ namespace BansheeEngine
 		if (texture == nullptr)
 			return nullptr;
 
-		ScriptSpriteTexture* scriptSpriteTex = ScriptResourceManager::instance().getScriptSpriteTexture(texture);
-		if (scriptSpriteTex == nullptr)
-			scriptSpriteTex = ScriptResourceManager::instance().createScriptSpriteTexture(texture);
+		ScriptSpriteTexture* scriptSpriteTex;
+		ScriptResourceManager::instance().getScriptResource(texture, &scriptSpriteTex, true);
 
 		return scriptSpriteTex->getManagedInstance();
 	}

+ 4 - 1
SBansheeEngine/Source/BsScriptStringTable.cpp

@@ -15,6 +15,8 @@ namespace BansheeEngine
 
 	void ScriptStringTable::initRuntimeData()
 	{
+		metaData.scriptClass->addInternalCall("internal_CreateInstance", &ScriptStringTable::internal_CreateInstance);
+
 		metaData.scriptClass->addInternalCall("Internal_GetNumStrings", &ScriptStringTable::internal_GetNumStrings);
 		metaData.scriptClass->addInternalCall("Internal_GetIdentifiers", &ScriptStringTable::internal_GetIdentifiers);
 
@@ -29,7 +31,8 @@ namespace BansheeEngine
 	{
 		HStringTable stringTable = StringTable::create();
 
-		ScriptResourceManager::instance().createScriptStringTable(instance, stringTable);
+		ScriptStringTable* scriptInstance;
+		ScriptResourceManager::instance().createScriptResource(instance, stringTable, &scriptInstance);
 	}
 
 	UINT32 ScriptStringTable::internal_GetNumStrings(ScriptStringTable* thisPtr)

+ 2 - 3
SBansheeEngine/Source/BsScriptStringTableManager.cpp

@@ -37,9 +37,8 @@ namespace BansheeEngine
 	{
 		HStringTable table = StringTableManager::instance().getTable(id);
 
-		ScriptStringTable* scriptStringTable = ScriptResourceManager::instance().getScriptStringTable(table);
-		if (scriptStringTable == nullptr)
-			scriptStringTable = ScriptResourceManager::instance().createScriptStringTable(table);
+		ScriptStringTable* scriptStringTable;
+		ScriptResourceManager::instance().getScriptResource(table, &scriptStringTable, true);
 
 		return scriptStringTable->getManagedInstance();
 	}

+ 2 - 1
SBansheeEngine/Source/BsScriptTexture2D.cpp

@@ -39,7 +39,8 @@ namespace BansheeEngine
 
 		HTexture texture = Texture::create(TEX_TYPE_2D, width, height, numMips, format, usage, gammaCorrection, numSamples);
 
-		ScriptResourceManager::instance().createScriptTexture2D(instance, texture);
+		ScriptTexture2D* scriptInstance;
+		ScriptResourceManager::instance().createScriptResource(instance, texture, &scriptInstance);
 	}
 
 	MonoObject* ScriptTexture2D::internal_getPixels(ScriptTexture2D* thisPtr, UINT32 mipLevel)

+ 2 - 1
SBansheeEngine/Source/BsScriptTexture3D.cpp

@@ -38,7 +38,8 @@ namespace BansheeEngine
 
 		HTexture texture = Texture::create(TEX_TYPE_3D, width, height, depth, numMips, format, usage, gammaCorrection);
 
-		ScriptResourceManager::instance().createScriptTexture3D(instance, texture);
+		ScriptTexture3D* scriptInstance;
+		ScriptResourceManager::instance().createScriptResource(instance, texture, &scriptInstance);
 	}
 
 	MonoObject* ScriptTexture3D::internal_getPixels(ScriptTexture3D* thisPtr, UINT32 mipLevel)

+ 2 - 1
SBansheeEngine/Source/BsScriptTextureCube.cpp

@@ -38,7 +38,8 @@ namespace BansheeEngine
 
 		HTexture texture = Texture::create(TEX_TYPE_CUBE_MAP, width, height, numMips, format, usage, gammaCorrection, numSamples);
 
-		ScriptResourceManager::instance().createScriptTextureCube(instance, texture);
+		ScriptTextureCube* scriptInstance;
+		ScriptResourceManager::instance().createScriptResource(instance, texture, &scriptInstance);
 	}
 
 	MonoObject* ScriptTextureCube::internal_getPixels(ScriptTextureCube* thisPtr, UINT32 face, UINT32 mipLevel)