aboutsummaryrefslogtreecommitdiff
path: root/game/src/Game/GameSession/billboard.gdshader
blob: e854bcf3b88035af61fbfbde40c2329813cf372b (plain) (blame)
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
shader_type spatial;
//render_mode unshaded;

uniform sampler2D billboards[255];
uniform int numframes[255];
uniform float sizes[255];

uniform float height_add_factor = 0.3;

//COLOR/INSTANCE_CUSTOM is our custom data, used as follows:
// x=image index
// y=frame in image index
// z=visible (0 = invisible, 1 = visible)

void vertex() {
   COLOR = INSTANCE_CUSTOM; //send instance_custom info to fragment
   float size = sizes[int(COLOR.x)];
   
   vec3 cam_right_worldspace = vec3(VIEW_MATRIX[0][0],VIEW_MATRIX[1][0],VIEW_MATRIX[2][0]);
   vec3 cam_up_worldspace = vec3(VIEW_MATRIX[0][1],VIEW_MATRIX[1][1],VIEW_MATRIX[2][1]);
   vec3 vert_pos_world =
      cam_right_worldspace * VERTEX.x * size +
      cam_up_worldspace * VERTEX.y * size;
   VERTEX = vert_pos_world + vec3(0,height_add_factor*size,0);
}

void fragment() {
   int image_index = int(COLOR.x);
   float frame_index = COLOR.y;
   
   float uv_x_space = 1.0/float(numframes[image_index]);
   vec2 uv_out = vec2(uv_x_space * (frame_index + UV.x),UV.y);
   ALBEDO.rgb = texture( billboards[image_index] ,uv_out).rgb;
   ALPHA = texture(billboards[image_index] ,uv_out).a * COLOR.z;
}