Skip to content

Commit a71d1cf

Browse files
SiegeLordExSiegeLord
authored andcommitted
Make ex_prim show the new u/v enabled high primitives (via shaders).
1 parent 2b475dd commit a71d1cf

File tree

6 files changed

+203
-4
lines changed

6 files changed

+203
-4
lines changed

‎examples/CMakeLists.txt‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ set(DATA_SHADERS
8484
ex_prim_shader_vertex.hlsl
8585
ex_prim_wrap_pixel.glsl
8686
ex_prim_wrap_pixel.hlsl
87+
ex_prim_high_vertex.glsl
88+
ex_prim_high_vertex.hlsl
89+
ex_prim_high_pixel.glsl
90+
ex_prim_high_pixel.hlsl
8791
ex_shader_multitex_pixel.glsl
8892
ex_shader_multitex_pixel.hlsl
8993
ex_shader_palette_pixel.glsl
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#ifdef GL_ES
2+
precision mediump float;
3+
#endif
4+
5+
varying vec2 texcoord;
6+
7+
void main()
8+
{
9+
gl_FragColor = vec4(mod(texcoord / 32.0, 1.0), 0, 1);
10+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// To match GLSL's
2+
float2 mod(float2 x, float2 y) {
3+
return x - y * floor(x / y);
4+
}
5+
6+
float4 ps_main(VS_OUTPUT Input) : COLOR0
7+
{
8+
return float4(mod(Input.TexCoord / 32.0, 1.0), 0, 1);
9+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
attribute vec4 al_pos;
2+
attribute vec2 al_texcoord;
3+
4+
uniform mat4 al_projview_matrix;
5+
6+
varying vec2 texcoord;
7+
8+
void main()
9+
{
10+
texcoord = al_texcoord;
11+
gl_Position = al_projview_matrix * al_pos;
12+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
struct VS_INPUT
2+
{
3+
float4 Position : POSITION0;
4+
float2 TexCoord : TEXCOORD0;
5+
};
6+
struct VS_OUTPUT
7+
{
8+
float4 Position : POSITION0;
9+
float2 TexCoord : TEXCOORD0;
10+
};
11+
12+
float4x4 al_projview_matrix;
13+
14+
VS_OUTPUT vs_main(VS_INPUT Input)
15+
{
16+
VS_OUTPUT Output;
17+
Output.Position = mul(Input.Position, al_projview_matrix);
18+
Output.TexCoord = Input.TexCoord;
19+
return Output;
20+
}

‎examples/ex_prim.c‎

Lines changed: 148 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
typedef void (*Screen)(int);
3232
int ScreenW = 800, ScreenH = 600;
33-
#define NUM_SCREENS 12
33+
#define NUM_SCREENS 14
3434
#define ROTATE_SPEED 0.0001f
3535
Screen Screens[NUM_SCREENS];
3636
const char *ScreenName[NUM_SCREENS];
@@ -40,6 +40,7 @@ ALLEGRO_BITMAP* Buffer;
4040
ALLEGRO_BITMAP* Texture;
4141
ALLEGRO_COLOR solid_white;
4242

43+
bool UseShader = false;
4344
int Soft = 0;
4445
int Blend = 1;
4546
float Speed = ROTATE_SPEED;
@@ -357,6 +358,146 @@ static void HighFilledPrimitives(int mode)
357358
}
358359
}
359360

361+
static void HighFilledPrimitivesShader(int mode)
362+
{
363+
static ALLEGRO_SHADER *shader;
364+
if (mode == INIT) {
365+
if (!UseShader)
366+
return;
367+
shader = al_create_shader(ALLEGRO_SHADER_AUTO);
368+
369+
if (!shader) {
370+
abort_example("Failed to create shader.");
371+
}
372+
373+
const char *vertex_shader_file;
374+
const char *pixel_shader_file;
375+
if (al_get_shader_platform(shader) == ALLEGRO_SHADER_GLSL) {
376+
vertex_shader_file = "data/ex_prim_high_vertex.glsl";
377+
pixel_shader_file = "data/ex_prim_high_pixel.glsl";
378+
}
379+
else {
380+
vertex_shader_file = "data/ex_prim_high_vertex.hlsl";
381+
pixel_shader_file = "data/ex_prim_high_pixel.hlsl";
382+
}
383+
384+
if (!al_attach_shader_source_file(shader, ALLEGRO_VERTEX_SHADER, vertex_shader_file)) {
385+
abort_example("al_attach_shader_source_file for vertex shader failed: %s\n",
386+
al_get_shader_log(shader));
387+
}
388+
if (!al_attach_shader_source_file(shader, ALLEGRO_PIXEL_SHADER, pixel_shader_file)) {
389+
abort_example("al_attach_shader_source_file for pixel shader failed: %s\n",
390+
al_get_shader_log(shader));
391+
}
392+
if (!al_build_shader(shader)) {
393+
abort_example("al_build_shader for link failed: %s\n", al_get_shader_log(shader));
394+
}
395+
} else if (mode == LOGIC) {
396+
Theta += Speed;
397+
al_build_transform(&MainTrans, ScreenW / 2, ScreenH / 2, 1, 1, Theta);
398+
} else if (mode == DRAW) {
399+
if (Blend)
400+
al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_ONE);
401+
else
402+
al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_ZERO);
403+
404+
al_use_transform(&MainTrans);
405+
if (!UseShader) {
406+
al_draw_text(Font, al_map_rgb_f(1, 1, 1), 0, -40, 0, "Enable shaders (by using --shader arg)");
407+
}
408+
else if (Soft) {
409+
al_draw_text(Font, al_map_rgb_f(1, 1, 1), 0, -40, 0, "Shaders don't work with software rendering");
410+
}
411+
else {
412+
ALLEGRO_SHADER* old_shader = al_get_current_shader();
413+
al_use_shader(shader);
414+
al_draw_filled_triangle(-100, -100, -150, 200, 100, 200, al_map_rgb_f(0.5, 0.7, 0.3));
415+
al_draw_filled_rectangle(20, -50, 200, 50, al_map_rgb_f(0.3, 0.2, 0.6));
416+
al_draw_filled_ellipse(-250, 0, 100, 150, al_map_rgb_f(0.3, 0.3, 0.3));
417+
al_draw_filled_rounded_rectangle(50, -250, 350, -75, 50, 70, al_map_rgb_f(0.4, 0.2, 0));
418+
al_draw_filled_pieslice(200, 125, 50, ALLEGRO_PI / 4, 3 * ALLEGRO_PI / 2, al_map_rgb_f(0.3, 0.3, 0.1));
419+
al_use_shader(old_shader);
420+
}
421+
al_use_transform(&Identity);
422+
}
423+
}
424+
425+
static void HighPrimitivesShader(int mode)
426+
{
427+
static ALLEGRO_SHADER *shader;
428+
if (mode == INIT) {
429+
if (!UseShader)
430+
return;
431+
shader = al_create_shader(ALLEGRO_SHADER_AUTO);
432+
433+
if (!shader) {
434+
abort_example("Failed to create shader.");
435+
}
436+
437+
const char *vertex_shader_file;
438+
const char *pixel_shader_file;
439+
if (al_get_shader_platform(shader) == ALLEGRO_SHADER_GLSL) {
440+
vertex_shader_file = "data/ex_prim_high_vertex.glsl";
441+
pixel_shader_file = "data/ex_prim_high_pixel.glsl";
442+
}
443+
else {
444+
vertex_shader_file = "data/ex_prim_high_vertex.hlsl";
445+
pixel_shader_file = "data/ex_prim_high_pixel.hlsl";
446+
}
447+
448+
if (!al_attach_shader_source_file(shader, ALLEGRO_VERTEX_SHADER, vertex_shader_file)) {
449+
abort_example("al_attach_shader_source_file for vertex shader failed: %s\n",
450+
al_get_shader_log(shader));
451+
}
452+
if (!al_attach_shader_source_file(shader, ALLEGRO_PIXEL_SHADER, pixel_shader_file)) {
453+
abort_example("al_attach_shader_source_file for pixel shader failed: %s\n",
454+
al_get_shader_log(shader));
455+
}
456+
if (!al_build_shader(shader)) {
457+
abort_example("al_build_shader for link failed: %s\n", al_get_shader_log(shader));
458+
}
459+
} else if (mode == LOGIC) {
460+
Theta += Speed;
461+
al_build_transform(&MainTrans, ScreenW / 2, ScreenH / 2, 1, 1, Theta);
462+
} else if (mode == DRAW) {
463+
if (Blend)
464+
al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_ONE);
465+
else
466+
al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_ZERO);
467+
468+
al_use_transform(&MainTrans);
469+
if (!UseShader) {
470+
al_draw_text(Font, al_map_rgb_f(1, 1, 1), 0, -40, 0, "Enable shaders (by using --shader arg)");
471+
}
472+
else if (Soft) {
473+
al_draw_text(Font, al_map_rgb_f(1, 1, 1), 0, -40, 0, "Shaders don't work with software rendering");
474+
}
475+
else {
476+
ALLEGRO_SHADER* old_shader = al_get_current_shader();
477+
al_use_shader(shader);
478+
// float points[8] = {
479+
// -300, -200,
480+
// 700, 200,
481+
// -700, 200,
482+
// 300, -200
483+
// };
484+
485+
al_draw_line(-300, -200, 300, 200, al_map_rgba_f(0, 0.5, 0.5, 1), Thickness);
486+
al_draw_triangle(-150, -250, 0, 250, 150, -250, al_map_rgba_f(0.5, 0, 0.5, 1), Thickness);
487+
al_draw_rectangle(-300, -200, 300, 200, al_map_rgba_f(0.5, 0, 0, 1), Thickness);
488+
al_draw_rounded_rectangle(-200, -125, 200, 125, 50, 100, al_map_rgba_f(0.2, 0.2, 0, 1), Thickness);
489+
490+
al_draw_ellipse(0, 0, 300, 150, al_map_rgba_f(0, 0.5, 0.5, 1), Thickness);
491+
al_draw_elliptical_arc(-20, 0, 300, 200, -ALLEGRO_PI / 2, -ALLEGRO_PI, al_map_rgba_f(0.25, 0.25, 0.5, 1), Thickness);
492+
al_draw_arc(0, 0, 200, -ALLEGRO_PI / 2, ALLEGRO_PI, al_map_rgba_f(0.5, 0.25, 0, 1), Thickness);
493+
// al_draw_spline(points, al_map_rgba_f(0.1, 0.2, 0.5, 1), Thickness);
494+
al_draw_pieslice(0, 25, 150, ALLEGRO_PI * 3 / 4, -ALLEGRO_PI / 2, al_map_rgba_f(0.4, 0.3, 0.1, 1), Thickness);
495+
al_use_shader(old_shader);
496+
}
497+
al_use_transform(&Identity);
498+
}
499+
}
500+
360501
static void TransformationsPrimitives(int mode)
361502
{
362503
float t = al_get_time();
@@ -638,11 +779,10 @@ int main(int argc, char **argv)
638779
ALLEGRO_BITMAP* bkg;
639780
ALLEGRO_COLOR black;
640781
ALLEGRO_EVENT_QUEUE *queue;
641-
bool use_shader = false;
642782

643783
if (argc > 1) {
644784
if (strcmp(argv[1], "--shader") == 0) {
645-
use_shader = true;
785+
UseShader = true;
646786
}
647787
else {
648788
abort_example("Invalid command line option: %s", argv[1]);
@@ -658,7 +798,7 @@ int main(int argc, char **argv)
658798
al_init_primitives_addon();
659799
init_platform_specific();
660800

661-
if (use_shader) {
801+
if (UseShader) {
662802
al_set_new_display_flags(ALLEGRO_PROGRAMMABLE_PIPELINE);
663803
}
664804

@@ -740,6 +880,8 @@ int main(int argc, char **argv)
740880
Screens[9] = CustomVertexFormatPrimitives;
741881
Screens[10] = VertexBuffers;
742882
Screens[11] = IndexedBuffers;
883+
Screens[12] = HighPrimitivesShader;
884+
Screens[13] = HighFilledPrimitivesShader;
743885

744886
ScreenName[0] = "Low Level Primitives";
745887
ScreenName[1] = "Indexed Primitives";
@@ -753,6 +895,8 @@ int main(int argc, char **argv)
753895
ScreenName[9] = "Custom Vertex Format";
754896
ScreenName[10] = "Vertex Buffers";
755897
ScreenName[11] = "Indexed Buffers";
898+
ScreenName[12] = "High Level Primitives + Shaders";
899+
ScreenName[13] = "High Level Filled Primitives + Shaders";
756900

757901
for (ii = 0; ii < NUM_SCREENS; ii++) {
758902
Screens[ii](INIT);

0 commit comments

Comments
 (0)