forked from playcanvas/engine
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpick.js
More file actions
91 lines (74 loc) · 2.72 KB
/
pick.js
File metadata and controls
91 lines (74 loc) · 2.72 KB
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
89
90
91
pc.programlib.pick = {
generateKey: function (device, options) {
var key = "pick";
if (options.skin) key += "_skin";
if (options.opacityMap) key += "_opam" + options.opacityChannel;
if (options.screenSpace) key += "_screenspace";
return key;
},
createShaderDefinition: function (device, options) {
/////////////////////////
// GENERATE ATTRIBUTES //
/////////////////////////
var attributes = {
vertex_position: pc.SEMANTIC_POSITION
};
if (options.skin) {
attributes.vertex_boneWeights = pc.SEMANTIC_BLENDWEIGHT;
attributes.vertex_boneIndices = pc.SEMANTIC_BLENDINDICES;
}
if (options.opacityMap) {
attributes.vertex_texCoord0 = pc.SEMANTIC_TEXCOORD0;
}
////////////////////////////
// GENERATE VERTEX SHADER //
////////////////////////////
var chunks = pc.shaderChunks;
var code = '';
// VERTEX SHADER DECLARATIONS
code += chunks.transformDeclVS;
if (options.skin) {
code += pc.programlib.skinCode(device);
code += chunks.transformSkinnedVS;
} else if (options.screenSpace) {
code += chunks.transformScreenSpaceVS;
} else {
code += chunks.transformVS;
}
if (options.opacityMap) {
code += "attribute vec2 vertex_texCoord0;\n\n";
code += 'varying vec2 vUv0;\n\n';
}
// VERTEX SHADER BODY
code += pc.programlib.begin();
code += " gl_Position = getPosition();\n";
if (options.opacityMap) {
code += ' vUv0 = vertex_texCoord0;\n';
}
code += pc.programlib.end();
var vshader = code;
//////////////////////////////
// GENERATE FRAGMENT SHADER //
//////////////////////////////
code = pc.programlib.precisionCode(device);
code += "uniform vec4 uColor;";
if (options.opacityMap) {
code += 'varying vec2 vUv0;\n\n';
code += 'uniform sampler2D texture_opacityMap;\n\n';
code += chunks.alphaTestPS;
}
// FRAGMENT SHADER BODY
code += pc.programlib.begin();
if (options.opacityMap) {
code += ' alphaTest( texture2D(texture_opacityMap, vUv0).' + options.opacityChannel[0] + ' );\n\n';
}
code += ' gl_FragColor = uColor;\n';
code += pc.programlib.end();
var fshader = code;
return {
attributes: attributes,
vshader: vshader,
fshader: fshader
};
}
};