|
@@ -19,10 +19,10 @@ class Splitter {
|
|
var vars : Map<Int,VarProps>;
|
|
var vars : Map<Int,VarProps>;
|
|
var varNames : Map<String,TVar>;
|
|
var varNames : Map<String,TVar>;
|
|
var varMap : Map<TVar,TVar>;
|
|
var varMap : Map<TVar,TVar>;
|
|
-
|
|
|
|
|
|
+
|
|
public function new() {
|
|
public function new() {
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
public function split( s : ShaderData ) : { vertex : ShaderData, fragment : ShaderData } {
|
|
public function split( s : ShaderData ) : { vertex : ShaderData, fragment : ShaderData } {
|
|
var vfun = null, vvars = new Map();
|
|
var vfun = null, vvars = new Map();
|
|
var ffun = null, fvars = new Map();
|
|
var ffun = null, fvars = new Map();
|
|
@@ -125,7 +125,7 @@ class Splitter {
|
|
checkVar(v, true, vvars);
|
|
checkVar(v, true, vvars);
|
|
for( v in fvars )
|
|
for( v in fvars )
|
|
checkVar(v, false, vvars);
|
|
checkVar(v, false, vvars);
|
|
-
|
|
|
|
|
|
+
|
|
// support for double mapping v -> v1 -> v2
|
|
// support for double mapping v -> v1 -> v2
|
|
for( v in varMap.keys() ) {
|
|
for( v in varMap.keys() ) {
|
|
var v2 = varMap.get(varMap.get(v));
|
|
var v2 = varMap.get(varMap.get(v));
|
|
@@ -151,7 +151,7 @@ class Splitter {
|
|
var vvars = [for( v in vvars ) if( !v.local ) v.v];
|
|
var vvars = [for( v in vvars ) if( !v.local ) v.v];
|
|
// make sure we sort the inputs the same way they were sent in
|
|
// make sure we sort the inputs the same way they were sent in
|
|
vvars.sort(function(v1, v2) return v1.id - v2.id);
|
|
vvars.sort(function(v1, v2) return v1.id - v2.id);
|
|
-
|
|
|
|
|
|
+
|
|
return {
|
|
return {
|
|
vertex : {
|
|
vertex : {
|
|
name : "vertex",
|
|
name : "vertex",
|
|
@@ -165,7 +165,7 @@ class Splitter {
|
|
},
|
|
},
|
|
};
|
|
};
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
function addExpr( f : TFunction, e : TExpr ) {
|
|
function addExpr( f : TFunction, e : TExpr ) {
|
|
switch( f.expr.e ) {
|
|
switch( f.expr.e ) {
|
|
case TBlock(el):
|
|
case TBlock(el):
|
|
@@ -174,7 +174,7 @@ class Splitter {
|
|
f.expr = { e : TBlock([f.expr, e]), t : TVoid, p : f.expr.p };
|
|
f.expr = { e : TBlock([f.expr, e]), t : TVoid, p : f.expr.p };
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
function checkVar( v : VarProps, vertex : Bool, vvars : Map<Int,VarProps> ) {
|
|
function checkVar( v : VarProps, vertex : Bool, vvars : Map<Int,VarProps> ) {
|
|
switch( v.v.kind ) {
|
|
switch( v.v.kind ) {
|
|
case Local if( v.requireInit ):
|
|
case Local if( v.requireInit ):
|
|
@@ -187,7 +187,7 @@ class Splitter {
|
|
default:
|
|
default:
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
function mapVars( e : TExpr ) {
|
|
function mapVars( e : TExpr ) {
|
|
return switch( e.e ) {
|
|
return switch( e.e ) {
|
|
case TVar(v):
|
|
case TVar(v):
|
|
@@ -197,7 +197,7 @@ class Splitter {
|
|
e.map(mapVars);
|
|
e.map(mapVars);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
function get( v : TVar ) {
|
|
function get( v : TVar ) {
|
|
var i = vars.get(v.id);
|
|
var i = vars.get(v.id);
|
|
if( i == null ) {
|
|
if( i == null ) {
|
|
@@ -207,7 +207,7 @@ class Splitter {
|
|
}
|
|
}
|
|
return i;
|
|
return i;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
function uniqueName( v : TVar ) {
|
|
function uniqueName( v : TVar ) {
|
|
if( v.kind == Global || v.kind == Output || v.kind == Input )
|
|
if( v.kind == Global || v.kind == Output || v.kind == Input )
|
|
return;
|
|
return;
|
|
@@ -222,7 +222,7 @@ class Splitter {
|
|
}
|
|
}
|
|
varNames.set(v.name, v);
|
|
varNames.set(v.name, v);
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
function checkExpr( e : TExpr ) {
|
|
function checkExpr( e : TExpr ) {
|
|
switch( e.e ) {
|
|
switch( e.e ) {
|
|
case TVar(v):
|
|
case TVar(v):
|
|
@@ -250,5 +250,5 @@ class Splitter {
|
|
e.iter(checkExpr);
|
|
e.iter(checkExpr);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
}
|
|
}
|