1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- package hrt.shgraph.nodes;
- using hxsl.Ast;
- @name("Sampler")
- @description("Get color from texture and UV")
- @group("Property")
- class Sampler extends ShaderNode {
- @input("Texture") var texture = SType.Sampler;
- @input("UV") var uv = SType.Vec2;
- @output("RGBA") var rgba = SType.Vec4;
- @output("R") var r = SType.Float;
- @output("G") var g = SType.Float;
- @output("B") var b = SType.Float;
- @output("A") var a = SType.Float;
- var components = [X, Y, Z, W];
- var componentsString = ["r", "g", "b", "a"];
- override public function computeOutputs() {
- addOutput("rgba", TVec(4, VFloat));
- addOutput("r", TFloat);
- addOutput("g", TFloat);
- addOutput("b", TFloat);
- addOutput("a", TFloat);
- }
- override public function build(key : String) : TExpr {
- if (key == "rgba") {
- var args = [];
- var varArgs = [];
- for (k in getInputInfoKeys()) {
- args.push({ name: k, type: getInput(k).getType() });
- var wantedType = ShaderType.getType(getInputInfo(k).type);
- varArgs.push(getInput(k).getVar((wantedType != null) ? wantedType : null));
- }
- return {
- p : null,
- t : rgba.type,
- e : TBinop(OpAssign, {
- e: TVar(rgba),
- p: null,
- t: rgba.type
- }, {
- e: TCall({
- e: TGlobal(Texture),
- p: null,
- t: TFun([
- {
- ret: rgba.type,
- args: args
- }
- ])
- }, varArgs),
- p: null,
- t: rgba.type
- })
- };
- } else {
- var arrayExpr = [];
- if (!outputCompiled.get("rgba")) {
- arrayExpr.push({ e : TVarDecl(rgba), t : rgba.type, p : null });
- arrayExpr.push(build("rgba"));
- outputCompiled.set("rgba", true);
- }
- var compIdx = componentsString.indexOf(key);
- arrayExpr.push({ e: TBinop(OpAssign, {
- e: TVar(getOutput(key)),
- p: null,
- t: getOutput(key).type
- }, {e: TSwiz({
- e: TVar(rgba),
- p: null,
- t: rgba.type
- },
- [components[compIdx]]),
- p: null,
- t: getOutput(key).type }),
- p: null,
- t: getOutput(key).type
- });
- if (arrayExpr.length > 1) {
- return {
- p : null,
- t : TVoid,
- e : TBlock(arrayExpr)
- };
- } else {
- return arrayExpr[0];
- }
- }
- }
- }
|