-
Notifications
You must be signed in to change notification settings - Fork 4
/
space.js
88 lines (75 loc) · 3.7 KB
/
space.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
(function(ns){
var Shade = require("../../../interfaces.js");
var Syntax = require('estraverse').Syntax;
var Tools = require("../../tools.js");
function getSpaceTransform(spaceArg, normal){
if( spaceArg.type != Syntax.MemberExpression ||
spaceArg.object.type != Syntax.Identifier ||
spaceArg.object.name != "Space" ||
spaceArg.property.type != Syntax.Identifier)
Shade.throwError(spaceArg, "We only support Space enums for the first argument of transformDirection and transformPoint");
switch(spaceArg.property.name){
case "VIEW": return normal ? "modelViewMatrixN" : "modelViewMatrix";
case "WORLD": return normal ? "modelMatrixN" : "modelMatrix";
default: Shade.throwError(spaceArg, "Unknown Space Type: '" + spaceArg.property.name + "'");
}
}
var ANNO = require("../../../type-system/annotation.js").ANNO;
var TYPES = Shade.TYPES,
KINDS = Shade.OBJECT_KINDS;
var SpaceEntry = {
transformDirection: { callExp: function(callExpression, parent, context, state){
var transform = getSpaceTransform(callExpression.arguments[0], true);
var result = { type: Syntax.BinaryExpression, operator: "*",
left: { type: Syntax.Identifier, name: transform},
right: callExpression.arguments[1]
};
ANNO(result).setType(TYPES.OBJECT, KINDS.FLOAT3);
ANNO(result.left).setType(TYPES.OBJECT, KINDS.MATRIX3);
ANNO(result.right).setType(TYPES.OBJECT, KINDS.FLOAT3);
var systemName = Tools.getNameForSystem(transform);
state.usedParameters.system[systemName] = state.systemParameters[transform];
return result;
} },
transformPoint: { callExp: function(callExpression, parent, context, state){
var transform = getSpaceTransform(callExpression.arguments[0], false);
var result = { type: Syntax.MemberExpression,
object: { type: Syntax.BinaryExpression, operator: "*",
left: { type: Syntax.Identifier, name: transform},
right: {type: Syntax.CallExpression,
callee: {type: Syntax.Identifier, name: "vec4"},
arguments: [
callExpression.arguments[1],
{ type: Syntax.Literal, value: 1, raw: 1}
]
}
},
property: { type: Syntax.Identifier, name: "xyz" }
};
ANNO(result).setType(TYPES.OBJECT, KINDS.FLOAT3);
ANNO(result.object).setType(TYPES.OBJECT, KINDS.FLOAT4);
ANNO(result.object.left).setType(TYPES.OBJECT, KINDS.MATRIX4);
ANNO(result.object.right).setType(TYPES.OBJECT, KINDS.FLOAT4);
ANNO(result.object.right.arguments[1]).setType(TYPES.NUMBER);
var systemName = Tools.getNameForSystem(transform);
state.usedParameters.system[systemName] = state.systemParameters[transform];
return result;
} },
VIEW: {
property: function (memberExpression) {
return memberExpression;
}},
WORLD: {
property: function (memberExpression) {
return memberExpression;
}}
};
Tools.extend(ns, {
id: "Space",
object: {
constructor: null,
static: SpaceEntry
},
instance: SpaceEntry
});
}(exports));