Преглед на файлове

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
 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
 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:
 BansheeEngine relies on the following 3rd party libraries:
- - Mono 3.2.3
+ - Mono 3.8.0
     - http://www.mono-project.com
     - http://www.mono-project.com
 	- See MonoIntegrationGuide.txt on how to compile & integrate Mono
 	- See MonoIntegrationGuide.txt on how to compile & integrate Mono
 
 
@@ -66,4 +67,7 @@ Place plug-in specific dependency files in:
   (Configuration) - Debug, Release, DebugRelease
   (Configuration) - Debug, Release, DebugRelease
 
 
 Other notes:
 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
                             2006-Jan-27
@@ -379,11 +164,3 @@ Legal Terms
   Our home page can be found at
   Our home page can be found at
 
 
     http://www.freetype.org
     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>
     </ProjectReference>
   </ItemGroup>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <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. 
   <!-- 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.
        Other similar extension points exist, see Microsoft.Common.targets.
   <Target Name="BeforeBuild">
   <Target Name="BeforeBuild">

+ 3 - 0
MBansheeEngine/MBansheeEngine.csproj

@@ -147,6 +147,9 @@
     <Compile Include="VirtualInput.cs" />
     <Compile Include="VirtualInput.cs" />
   </ItemGroup>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <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. 
   <!-- 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.
        Other similar extension points exist, see Microsoft.Common.targets.
   <Target Name="BeforeBuild">
   <Target Name="BeforeBuild">

+ 4 - 0
MBansheeEngine/StringTable.cs

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

+ 25 - 12
SBansheeEditor/Source/BsGUIResourceField.cpp

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

+ 2 - 3
SBansheeEditor/Source/BsScriptProjectLibrary.cpp

@@ -93,9 +93,8 @@ namespace BansheeEngine
 		if (!resource)
 		if (!resource)
 			return nullptr;
 			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();
 		return scriptResource->getManagedInstance();
 	}
 	}

+ 1 - 0
SBansheeEngine/Include/BsManagedSerializableObjectInfo.h

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

+ 0 - 27
SBansheeEngine/Include/BsScriptAssemblyManager.h

@@ -26,19 +26,6 @@ namespace BansheeEngine
 		MonoClass* getComponentClass() const { return mComponentClass; }
 		MonoClass* getComponentClass() const { return mComponentClass; }
 		MonoClass* getMissingComponentClass() const { return mMissingComponentClass; }
 		MonoClass* getMissingComponentClass() const { return mMissingComponentClass; }
 		MonoClass* getSceneObjectClass() const { return mSceneObjectClass; }
 		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);
 		ManagedSerializableTypeInfoPtr determineType(MonoClass* monoClass);
 	private:
 	private:
@@ -53,20 +40,6 @@ namespace BansheeEngine
 		MonoClass* mSceneObjectClass;
 		MonoClass* mSceneObjectClass;
 		MonoClass* mMissingComponentClass;
 		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* mSerializeObjectAttribute;
 		MonoClass* mDontSerializeFieldAttribute;
 		MonoClass* mDontSerializeFieldAttribute;
 		MonoClass* mSerializeFieldAttribute;
 		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.
 		 * @note Throws an exception if resource for the handle already exists.
 		 * 		 Creates a new managed instance of the object.
 		 * 		 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.
 		 * @note Throws an exception if resource for the handle already exists.
 		 * 		 Initializes the ScriptResource with an existing managed instance.
 		 * 		 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.
 		 * @note Returns nullptr if script resource doesn't exist.
 		 */
 		 */
 		ScriptResourceBase* getScriptResource(const String& UUID);
 		ScriptResourceBase* getScriptResource(const String& UUID);
 
 
-		/**
-		 * @note Returns nullptr if script resource doesn't exist.
-		 */
-		ScriptResourceBase* createScriptResource(const HResource& resource);
-
 		void destroyScriptResource(ScriptResourceBase* resource);
 		void destroyScriptResource(ScriptResourceBase* resource);
 
 
 	private:
 	private:

+ 2 - 1
SBansheeEngine/Source/BsManagedResource.cpp

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

+ 65 - 34
SBansheeEngine/Source/BsManagedSerializableField.cpp

@@ -16,6 +16,7 @@
 #include "BsScriptMaterial.h"
 #include "BsScriptMaterial.h"
 #include "BsScriptMesh.h"
 #include "BsScriptMesh.h"
 #include "BsScriptPrefab.h"
 #include "BsScriptPrefab.h"
+#include "BsScriptFont.h"
 #include "BsScriptStringTable.h"
 #include "BsScriptStringTable.h"
 #include "BsScriptSceneObject.h"
 #include "BsScriptSceneObject.h"
 #include "BsScriptComponent.h"
 #include "BsScriptComponent.h"
@@ -258,6 +259,18 @@ namespace BansheeEngine
 
 
 				return fieldData;
 				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:
 			case ScriptPrimitiveType::StringTableRef:
 			{
 			{
 				auto fieldData = bs_shared_ptr<ManagedSerializableFieldDataResourceRef>();
 				auto fieldData = bs_shared_ptr<ManagedSerializableFieldDataResourceRef>();
@@ -545,9 +558,9 @@ namespace BansheeEngine
 				if(value)
 				if(value)
 				{
 				{
 					HTexture texture = static_resource_cast<Texture>(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();
 					return scriptResource->getManagedInstance();
 				}
 				}
@@ -559,9 +572,9 @@ namespace BansheeEngine
 				if (value)
 				if (value)
 				{
 				{
 					HTexture texture = static_resource_cast<Texture>(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();
 					return scriptResource->getManagedInstance();
 				}
 				}
@@ -573,9 +586,9 @@ namespace BansheeEngine
 				if (value)
 				if (value)
 				{
 				{
 					HTexture texture = static_resource_cast<Texture>(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();
 					return scriptResource->getManagedInstance();
 				}
 				}
@@ -587,9 +600,9 @@ namespace BansheeEngine
 				if(value)
 				if(value)
 				{
 				{
 					HSpriteTexture spriteTexture = static_resource_cast<SpriteTexture>(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)
 					if(scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
 						return scriptResource->getManagedInstance();
@@ -602,9 +615,9 @@ namespace BansheeEngine
 				if (value)
 				if (value)
 				{
 				{
 					HShader shader = static_resource_cast<Shader>(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)
 					if (scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
 						return scriptResource->getManagedInstance();
@@ -617,9 +630,9 @@ namespace BansheeEngine
 				if (value)
 				if (value)
 				{
 				{
 					HMaterial material = static_resource_cast<Material>(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)
 					if (scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
 						return scriptResource->getManagedInstance();
@@ -632,9 +645,9 @@ namespace BansheeEngine
 				if (value)
 				if (value)
 				{
 				{
 					HMesh mesh = static_resource_cast<Mesh>(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)
 					if (scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
 						return scriptResource->getManagedInstance();
@@ -647,9 +660,9 @@ namespace BansheeEngine
 				if (value)
 				if (value)
 				{
 				{
 					HPlainText plainText = static_resource_cast<PlainText>(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)
 					if (scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
 						return scriptResource->getManagedInstance();
@@ -662,9 +675,9 @@ namespace BansheeEngine
 				if (value)
 				if (value)
 				{
 				{
 					HScriptCode scriptCode = static_resource_cast<ScriptCode>(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)
 					if (scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
 						return scriptResource->getManagedInstance();
@@ -677,9 +690,24 @@ namespace BansheeEngine
 				if (value)
 				if (value)
 				{
 				{
 					HPrefab prefab = static_resource_cast<Prefab>(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)
 					if (scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
 						return scriptResource->getManagedInstance();
@@ -692,9 +720,9 @@ namespace BansheeEngine
 				if (value)
 				if (value)
 				{
 				{
 					HStringTable stringTable = static_resource_cast<StringTable>(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)
 					if (scriptResource != nullptr)
 						return scriptResource->getManagedInstance();
 						return scriptResource->getManagedInstance();
@@ -707,7 +735,10 @@ namespace BansheeEngine
 				if (value)
 				if (value)
 				{
 				{
 					HManagedResource managedResource = static_resource_cast<ManagedResource>(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
 					assert(scriptResource != nullptr); // Managed resource managed instance is created upon creation so it may never be null
 
 
 					return scriptResource->getManagedInstance();
 					return scriptResource->getManagedInstance();

+ 27 - 12
SBansheeEngine/Source/BsManagedSerializableObjectInfo.cpp

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

+ 37 - 85
SBansheeEngine/Source/BsScriptAssemblyManager.cpp

@@ -8,6 +8,19 @@
 #include "BsMonoField.h"
 #include "BsMonoField.h"
 #include "BsMonoMethod.h"
 #include "BsMonoMethod.h"
 #include "BsMonoProperty.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 "BsMonoUtil.h"
 #include "BsRTTIType.h"
 #include "BsRTTIType.h"
 
 
@@ -15,11 +28,8 @@ namespace BansheeEngine
 {
 {
 	ScriptAssemblyManager::ScriptAssemblyManager()
 	ScriptAssemblyManager::ScriptAssemblyManager()
 		:mBaseTypesInitialized(false), mSerializeObjectAttribute(nullptr), mDontSerializeFieldAttribute(nullptr), 
 		: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;
 		mAssemblyInfos[assemblyName] = assemblyInfo;
 
 
+		MonoClass* managedResourceClass = ScriptManagedResource::getMetaData()->scriptClass;
+
 		// Populate class data
 		// Populate class data
 		const Vector<MonoClass*>& allClasses = curAssembly->getAllClasses();
 		const Vector<MonoClass*>& allClasses = curAssembly->getAllClasses();
 		for(auto& curClass : allClasses)
 		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>();
 				std::shared_ptr<ManagedSerializableTypeInfoObject> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoObject>();
 				typeInfo->mTypeNamespace = curClass->getNamespace();
 				typeInfo->mTypeNamespace = curClass->getNamespace();
@@ -259,73 +271,79 @@ namespace BansheeEngine
 				return typeInfo;
 				return typeInfo;
 			}
 			}
 		case MONO_TYPE_CLASS:
 		case MONO_TYPE_CLASS:
-			if(monoClass->isSubClassOf(mTexture2DClass))
+			if(monoClass->isSubClassOf(ScriptTexture2D::getMetaData()->scriptClass))
 			{
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::Texture2DRef;
 				typeInfo->mType = ScriptPrimitiveType::Texture2DRef;
 				return typeInfo;
 				return typeInfo;
 			}
 			}
-			if (monoClass->isSubClassOf(mTexture3DClass))
+			if (monoClass->isSubClassOf(ScriptTexture3D::getMetaData()->scriptClass))
 			{
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::Texture3DRef;
 				typeInfo->mType = ScriptPrimitiveType::Texture3DRef;
 				return typeInfo;
 				return typeInfo;
 			}
 			}
-			if (monoClass->isSubClassOf(mTextureCubeClass))
+			if (monoClass->isSubClassOf(ScriptTextureCube::getMetaData()->scriptClass))
 			{
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::TextureCubeRef;
 				typeInfo->mType = ScriptPrimitiveType::TextureCubeRef;
 				return typeInfo;
 				return typeInfo;
 			}
 			}
-			else if(monoClass->isSubClassOf(mSpriteTextureClass))
+			else if (monoClass->isSubClassOf(ScriptSpriteTexture::getMetaData()->scriptClass))
 			{
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::SpriteTextureRef;
 				typeInfo->mType = ScriptPrimitiveType::SpriteTextureRef;
 				return typeInfo;
 				return typeInfo;
 			}
 			}
-			else if (monoClass->isSubClassOf(mManagedResourceClass))
+			else if (monoClass->isSubClassOf(ScriptManagedResource::getMetaData()->scriptClass))
 			{
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::ManagedResourceRef;
 				typeInfo->mType = ScriptPrimitiveType::ManagedResourceRef;
 				return typeInfo;
 				return typeInfo;
 			}
 			}
-			else if (monoClass->isSubClassOf(mShaderClass))
+			else if (monoClass->isSubClassOf(ScriptShader::getMetaData()->scriptClass))
 			{
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::ShaderRef;
 				typeInfo->mType = ScriptPrimitiveType::ShaderRef;
 				return typeInfo;
 				return typeInfo;
 			}
 			}
-			else if (monoClass->isSubClassOf(mMaterialClass))
+			else if (monoClass->isSubClassOf(ScriptMaterial::getMetaData()->scriptClass))
 			{
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::MaterialRef;
 				typeInfo->mType = ScriptPrimitiveType::MaterialRef;
 				return typeInfo;
 				return typeInfo;
 			}
 			}
-			else if (monoClass->isSubClassOf(mMeshClass))
+			else if (monoClass->isSubClassOf(ScriptMesh::getMetaData()->scriptClass))
 			{
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::MeshRef;
 				typeInfo->mType = ScriptPrimitiveType::MeshRef;
 				return typeInfo;
 				return typeInfo;
 			}
 			}
-			else if (monoClass->isSubClassOf(mPlainTextClass))
+			else if (monoClass->isSubClassOf(ScriptPlainText::getMetaData()->scriptClass))
 			{
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::PlainTextRef;
 				typeInfo->mType = ScriptPrimitiveType::PlainTextRef;
 				return typeInfo;
 				return typeInfo;
 			}
 			}
-			else if (monoClass->isSubClassOf(mScriptCodeClass))
+			else if (monoClass->isSubClassOf(ScriptScriptCode::getMetaData()->scriptClass))
 			{
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::ScriptCodeRef;
 				typeInfo->mType = ScriptPrimitiveType::ScriptCodeRef;
 				return typeInfo;
 				return typeInfo;
 			}
 			}
-			else if (monoClass->isSubClassOf(mPrefabClass))
+			else if (monoClass->isSubClassOf(ScriptPrefab::getMetaData()->scriptClass))
 			{
 			{
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::PrefabRef;
 				typeInfo->mType = ScriptPrimitiveType::PrefabRef;
 				return typeInfo;
 				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>();
 				std::shared_ptr<ManagedSerializableTypeInfoPrimitive> typeInfo = bs_shared_ptr<ManagedSerializableTypeInfoPrimitive>();
 				typeInfo->mType = ScriptPrimitiveType::StringTableRef;
 				typeInfo->mType = ScriptPrimitiveType::StringTableRef;
@@ -433,20 +451,6 @@ namespace BansheeEngine
 		mSceneObjectClass = nullptr;
 		mSceneObjectClass = nullptr;
 		mMissingComponentClass = 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;
 		mSerializeFieldAttribute = nullptr;
 		mHideInInspectorAttribute = nullptr;
 		mHideInInspectorAttribute = nullptr;
 	}
 	}
@@ -494,58 +498,6 @@ namespace BansheeEngine
 		if(mSceneObjectClass == nullptr)
 		if(mSceneObjectClass == nullptr)
 			BS_EXCEPT(InvalidStateException, "Cannot find SceneObject managed class.");
 			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");
 		mSerializeFieldAttribute = bansheeEngineAssembly->getClass("BansheeEngine", "SerializeField");
 		if(mSerializeFieldAttribute == nullptr)
 		if(mSerializeFieldAttribute == nullptr)
 			BS_EXCEPT(InvalidStateException, "Cannot find SerializeField managed class.");
 			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();
 		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();
 		return scriptSpriteTex->getManagedInstance();
 	}
 	}
@@ -35,9 +34,8 @@ namespace BansheeEngine
 	{
 	{
 		HShader diffuseShader = BuiltinResources::instance().getDiffuseShader();
 		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();
 		return scriptShader->getManagedInstance();
 	}
 	}

+ 11 - 13
SBansheeEngine/Source/BsScriptMaterial.cpp

@@ -59,7 +59,9 @@ namespace BansheeEngine
 			nativeShader = BuiltinResources::instance().getDummyShader();
 			nativeShader = BuiltinResources::instance().getDummyShader();
 
 
 		HMaterial material = Material::create(nativeShader);
 		HMaterial material = Material::create(nativeShader);
-		ScriptResourceManager::instance().createScriptMaterial(instance, material);
+
+		ScriptMaterial* scriptInstance;
+		ScriptResourceManager::instance().createScriptResource(instance, material, &scriptInstance);
 	}
 	}
 
 
 	MonoObject* ScriptMaterial::internal_GetShader(ScriptMaterial* nativeInstance)
 	MonoObject* ScriptMaterial::internal_GetShader(ScriptMaterial* nativeInstance)
@@ -69,9 +71,8 @@ namespace BansheeEngine
 		if (shader == nullptr)
 		if (shader == nullptr)
 			return 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();
 		return scriptShader->getManagedInstance();
 	}
 	}
@@ -230,9 +231,8 @@ namespace BansheeEngine
 		if (texture == nullptr)
 		if (texture == nullptr)
 			return 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();
 		return scriptTexture->getManagedInstance();
 	}
 	}
@@ -245,9 +245,8 @@ namespace BansheeEngine
 		if (texture == nullptr)
 		if (texture == nullptr)
 			return 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();
 		return scriptTexture->getManagedInstance();
 	}
 	}
@@ -260,9 +259,8 @@ namespace BansheeEngine
 		if (texture == nullptr)
 		if (texture == nullptr)
 			return 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();
 		return scriptTexture->getManagedInstance();
 	}
 	}

+ 4 - 2
SBansheeEngine/Source/BsScriptMesh.cpp

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

+ 2 - 1
SBansheeEngine/Source/BsScriptPlainText.cpp

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

+ 2 - 1
SBansheeEngine/Source/BsScriptPrefab.cpp

@@ -27,7 +27,8 @@ namespace BansheeEngine
 	{
 	{
 		HPrefab prefab = Prefab::create(so->getNativeSceneObject());
 		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)
 	MonoObject* ScriptPrefab::internal_GetRoot(ScriptPrefab* thisPtr)

+ 6 - 9
SBansheeEngine/Source/BsScriptRenderTexture2D.cpp

@@ -149,9 +149,8 @@ namespace BansheeEngine
 			{
 			{
 				HTexture colorTex = tex->getBindableColorTexture(i);
 				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());
 				outArray.set(i, scriptSurface->getManagedInstance());
 				*value = outArray.getInternal();
 				*value = outArray.getInternal();
@@ -164,9 +163,8 @@ namespace BansheeEngine
 
 
 			HTexture colorTex = tex->getBindableColorTexture();
 			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());
 			outArray.set(0, scriptSurface->getManagedInstance());
 			*value = outArray.getInternal();
 			*value = outArray.getInternal();
@@ -187,9 +185,8 @@ namespace BansheeEngine
 			colorTex = tex->getBindableDepthStencilTexture();
 			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();
 		*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();
 		const String& uuid = resourceHandle.getUUID();
 #if BS_DEBUG_MODE
 #if BS_DEBUG_MODE
 		throwExceptionIfInvalidOrDuplicate(uuid);
 		throwExceptionIfInvalidOrDuplicate(uuid);
 #endif
 #endif
 
 
-		ScriptSpriteTexture* scriptResource = new (bs_alloc<ScriptSpriteTexture>()) ScriptSpriteTexture(instance, resourceHandle);
+		RetType* scriptResource = new (bs_alloc<RetType>()) RetType(instance, resourceHandle);
 		mScriptResources[uuid] = scriptResource;
 		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
 #if BS_DEBUG_MODE
-		throwExceptionIfInvalidOrDuplicate(uuid);
+		throwExceptionIfInvalidOrDuplicate(resourceHandle.getUUID());
 #endif
 #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)
 		switch (resTypeID)
 		{
 		{
 		case TID_Texture:
 		case TID_Texture:
 		{
 		{
-			HTexture texture = static_resource_cast<Texture>(resource);
+			HTexture texture = static_resource_cast<Texture>(resourceHandle);
 			TextureType type = texture->getProperties().getTextureType();
 			TextureType type = texture->getProperties().getTextureType();
 
 
 			if (type == TEX_TYPE_3D)
 			if (type == TEX_TYPE_3D)
-				return createScriptTexture3D(texture);
+				return createScriptResource(texture, (ScriptTexture3D**)out);
 			else if (type == TEX_TYPE_CUBE_MAP)
 			else if (type == TEX_TYPE_CUBE_MAP)
-				return createScriptTextureCube(texture);
+				return createScriptResource(texture, (ScriptTextureCube**)out);
 			else
 			else
-				return createScriptTexture2D(texture);
+				return createScriptResource(texture, (ScriptTexture2D**)out);
 		}
 		}
 		case TID_SpriteTexture:
 		case TID_SpriteTexture:
-			return createScriptSpriteTexture(static_resource_cast<SpriteTexture>(resource));
+			return createScriptResource(static_resource_cast<SpriteTexture>(resourceHandle), (ScriptSpriteTexture**)out);
 		case TID_Font:
 		case TID_Font:
-			return createScriptFont(static_resource_cast<Font>(resource));
+			return createScriptResource(static_resource_cast<Font>(resourceHandle), (ScriptFont**)out);
 		case TID_PlainText:
 		case TID_PlainText:
-			return createScriptPlainText(static_resource_cast<PlainText>(resource));
+			return createScriptResource(static_resource_cast<PlainText>(resourceHandle), (ScriptPlainText**)out);
 		case TID_ScriptCode:
 		case TID_ScriptCode:
-			return createScriptScriptCode(static_resource_cast<ScriptCode>(resource));
+			return createScriptResource(static_resource_cast<ScriptCode>(resourceHandle), (ScriptScriptCode**)out);
 		case TID_Shader:
 		case TID_Shader:
-			return createScriptShader(static_resource_cast<Shader>(resource));
+			return createScriptResource(static_resource_cast<Shader>(resourceHandle), (ScriptShader**)out);
 		case TID_Prefab:
 		case TID_Prefab:
-			return createScriptPrefab(static_resource_cast<Prefab>(resource));
+			return createScriptResource(static_resource_cast<Prefab>(resourceHandle), (ScriptPrefab**)out);
 		case TID_StringTable:
 		case TID_StringTable:
-			return createScriptStringTable(static_resource_cast<StringTable>(resource));
+			return createScriptResource(static_resource_cast<StringTable>(resourceHandle), (ScriptStringTable**)out);
 		case TID_Material:
 		case TID_Material:
-			return createScriptMaterial(static_resource_cast<Material>(resource));
+			return createScriptResource(static_resource_cast<Material>(resourceHandle), (ScriptMaterial**)out);
 		case TID_Mesh:
 		case TID_Mesh:
-			return createScriptMesh(static_resource_cast<Mesh>(resource));
+			return createScriptResource(static_resource_cast<Mesh>(resourceHandle), (ScriptMesh**)out);
 		case TID_ManagedResource:
 		case TID_ManagedResource:
 			BS_EXCEPT(InternalErrorException, "Managed resources must have a managed instance by default, this call is invalid.")
 			BS_EXCEPT(InternalErrorException, "Managed resources must have a managed instance by default, this call is invalid.")
 				break;
 				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)
 	void ScriptResourceManager::destroyScriptResource(ScriptResourceBase* resource)
 	{
 	{
 		HResource resourceHandle = resource->getNativeHandle();
 		HResource resourceHandle = resource->getNativeHandle();

+ 2 - 1
SBansheeEngine/Source/BsScriptScriptCode.cpp

@@ -28,7 +28,8 @@ namespace BansheeEngine
 		WString strText = MonoUtil::monoToWString(text);
 		WString strText = MonoUtil::monoToWString(text);
 		HScriptCode scriptCode = ScriptCode::create(strText);
 		HScriptCode scriptCode = ScriptCode::create(strText);
 
 
-		ScriptResourceManager::instance().createScriptScriptCode(instance, scriptCode);
+		ScriptScriptCode* scriptInstance;
+		ScriptResourceManager::instance().createScriptResource(instance, scriptCode, &scriptInstance);
 	}
 	}
 
 
 	MonoString* ScriptScriptCode::internal_getText(ScriptScriptCode* thisPtr)
 	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)
 	void ScriptSpriteTexture::internal_createInstance(MonoObject* instance, MonoObject* texture, Vector2 offset, Vector2 scale)
 	{
 	{
 		ScriptTexture2D* scriptTexture = ScriptTexture2D::toNative(texture);
 		ScriptTexture2D* scriptTexture = ScriptTexture2D::toNative(texture);
+		ScriptSpriteTexture* scriptInstance;
 
 
 		if (scriptTexture == nullptr)
 		if (scriptTexture == nullptr)
 		{
 		{
-			ScriptResourceManager::instance().createScriptSpriteTexture(instance, SpriteTexture::dummy());
+			ScriptResourceManager::instance().createScriptResource(instance, SpriteTexture::dummy(), &scriptInstance);
 		}
 		}
 		else
 		else
 		{
 		{
 			HSpriteTexture spriteTexture = SpriteTexture::create(offset, scale, static_resource_cast<Texture>(scriptTexture->getNativeHandle()));
 			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)
 		if (texture == nullptr)
 			return 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();
 		return scriptSpriteTex->getManagedInstance();
 	}
 	}

+ 4 - 1
SBansheeEngine/Source/BsScriptStringTable.cpp

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

+ 2 - 3
SBansheeEngine/Source/BsScriptStringTableManager.cpp

@@ -37,9 +37,8 @@ namespace BansheeEngine
 	{
 	{
 		HStringTable table = StringTableManager::instance().getTable(id);
 		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();
 		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);
 		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)
 	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);
 		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)
 	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);
 		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)
 	MonoObject* ScriptTextureCube::internal_getPixels(ScriptTextureCube* thisPtr, UINT32 face, UINT32 mipLevel)