|
@@ -7,15 +7,12 @@ class SceneLoader extends h3d.impl.Serializable.SceneSerializer {
|
|
var hsdPath : String;
|
|
var hsdPath : String;
|
|
var projectPath : String;
|
|
var projectPath : String;
|
|
var scene : Scene;
|
|
var scene : Scene;
|
|
- var shaderPath : Array<String>;
|
|
|
|
- var shaderCache = new Map<String, hxsl.SharedShader>();
|
|
|
|
|
|
|
|
public function new(hsdPath, scene) {
|
|
public function new(hsdPath, scene) {
|
|
ide = hide.ui.Ide.inst;
|
|
ide = hide.ui.Ide.inst;
|
|
super();
|
|
super();
|
|
this.hsdPath = hsdPath;
|
|
this.hsdPath = hsdPath;
|
|
this.scene = scene;
|
|
this.scene = scene;
|
|
- shaderPath = ide.currentProps.get("haxe.classPath");
|
|
|
|
}
|
|
}
|
|
|
|
|
|
override function initHSDPaths(resPath:String, projectPath:String) {
|
|
override function initHSDPaths(resPath:String, projectPath:String) {
|
|
@@ -24,69 +21,7 @@ class SceneLoader extends h3d.impl.Serializable.SceneSerializer {
|
|
}
|
|
}
|
|
|
|
|
|
override function loadShader(name:String) : hxsl.Shader {
|
|
override function loadShader(name:String) : hxsl.Shader {
|
|
- var s = loadSharedShader(name);
|
|
|
|
- if( s == null )
|
|
|
|
- return null;
|
|
|
|
- return new hxsl.DynamicShader(s);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- function loadSharedShader( name : String ) {
|
|
|
|
- var s = shaderCache.get(name);
|
|
|
|
- if( s != null )
|
|
|
|
- return s;
|
|
|
|
- var e = loadShaderExpr(name);
|
|
|
|
- if( e == null )
|
|
|
|
- return null;
|
|
|
|
- var chk = new hxsl.Checker();
|
|
|
|
- chk.loadShader = function(iname) {
|
|
|
|
- var e = loadShaderExpr(iname);
|
|
|
|
- if( e == null )
|
|
|
|
- throw "Could not @:import " + iname + " (referenced from " + name+")";
|
|
|
|
- return e;
|
|
|
|
- };
|
|
|
|
- var s = new hxsl.SharedShader("");
|
|
|
|
- s.data = chk.check(name, e);
|
|
|
|
- @:privateAccess s.initialize();
|
|
|
|
- shaderCache.set(name, s);
|
|
|
|
- return s;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- function loadShaderExpr( name : String ) : hxsl.Ast.Expr {
|
|
|
|
- var path = name.split(".").join("/")+".hx";
|
|
|
|
- for( s in shaderPath ) {
|
|
|
|
- var file = ide.projectDir + "/" + s + "/" + path;
|
|
|
|
- if( sys.FileSystem.exists(file) )
|
|
|
|
- return loadShaderString(file,sys.io.File.getContent(file));
|
|
|
|
- }
|
|
|
|
- if( StringTools.startsWith(name,"h3d.shader.") ) {
|
|
|
|
- var r = haxe.Resource.getString("shader/" + name.substr(11));
|
|
|
|
- if( r != null ) return loadShaderString(path, r);
|
|
|
|
- }
|
|
|
|
- return null;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- function loadShaderString( file : String, content : String ) {
|
|
|
|
- var r = ~/var[ \t]+SRC[ \t]+=[ \t]+\{/;
|
|
|
|
- if( !r.match(content) )
|
|
|
|
- throw file+" does not contain shader SRC";
|
|
|
|
- var src = r.matchedRight();
|
|
|
|
- var count = 1;
|
|
|
|
- var pos = 0;
|
|
|
|
- while( pos < src.length ) {
|
|
|
|
- switch( src.charCodeAt(pos++) ) {
|
|
|
|
- case '{'.code: count++;
|
|
|
|
- case '}'.code: count--; if( count == 0 ) break;
|
|
|
|
- default:
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- src = src.substr(0, pos - 1);
|
|
|
|
- var parser = new hscript.Parser();
|
|
|
|
- parser.allowTypes = true;
|
|
|
|
- parser.allowMetadata = true;
|
|
|
|
- parser.line = r.matchedLeft().split("\n").length;
|
|
|
|
- var e = parser.parseString(src, file);
|
|
|
|
- var e = new hscript.Macro({ min : 0, max : 0, file : file }).convert(e);
|
|
|
|
- return new hxsl.MacroParser().parseExpr(e);
|
|
|
|
|
|
+ return ide.shaderLoader.load(name);
|
|
}
|
|
}
|
|
|
|
|
|
override function loadHMD(path:String) {
|
|
override function loadHMD(path:String) {
|