All pastes #2115470 Raw Edit

Untitled

public text v1 · immutable
#2115470 ·published 2012-02-09 19:57 UTC
rendered paste body
#include "allegro5/allegro5.h"
#include "allegro5/allegro_shader.h"
#include "allegro5/allegro_image.h"
#include "allegro5/allegro_primitives.h"
#include <cstdio>

// FIXME: supported drivers should go in alplatf.h
// Uncomment one of these three blocks depending what driver you want

//#define HLSL
//#include "allegro5/allegro_direct3d.h"
//#include "allegro5/allegro_shader_hlsl.h"

#define GLSL
#include "allegro5/allegro_opengl.h"
#include "allegro5/allegro_shader_glsl.h"

/*
#define CG
#include <Cg/cg.h>
*/

#ifdef HLSL
#define TOP 0
#define BOT 1
#define vsource_name hlsl_vertex_source
#define psource_name hlsl_pixel_source
#define PLATFORM ALLEGRO_SHADER_HLSL
#elif defined GLSL
#define TOP 1
#define BOT 0
#define vsource_name glsl_vertex_source
#define psource_name glsl_pixel_source
#define PLATFORM ALLEGRO_SHADER_GLSL
#else
#define TOP 1
#define BOT 0
#define vsource_name cg_vertex_source
#define psource_name cg_pixel_source
#define PLATFORM ALLEGRO_SHADER_CG
#endif

#ifdef GLSL
#define EX_SHADER_FLAGS ALLEGRO_OPENGL
#else
#define EX_SHADER_FLAGS 0
#endif

#ifdef CG	
static const char *cg_vertex_source =
   "uniform float4x4 projview_matrix;\n"
   "void vs_main(\n"
   "  in float3 pos        : POSITION,\n"
   "  in float4 color      : COLOR0,\n"
   "  in float2 texcoord   : TEXCOORD0,\n"
   "  out float4 posO      : POSITION,\n"
   "  out float4 colorO    : COLOR0,\n"
   "  out float2 texcoordO : TEXCOORD0)\n"
   "{\n"
   "  posO = mul(float4(pos, 1.0), projview_matrix);\n"
   "  colorO = color;\n"
   "  texcoordO = texcoord;\n"
   "}\n";

static const char *cg_pixel_source =
   "uniform sampler2D tex;\n"
   "uniform float3 tint;\n"
   "void ps_main(\n"
   "  in float4 color    : COLOR0,\n"
   "  in float2 texcoord : TEXCOORD0,\n"
   "  out float4 colorO  : COLOR0)\n"
   "{\n"
   "  colorO = color * tex2D(tex, texcoord);\n"
   "  colorO.r *= tint.r;\n"
   "  colorO.g *= tint.g;\n"
   "  colorO.b *= tint.b;\n"
   "}\n";
#endif

#ifdef HLSL
static const char *hlsl_vertex_source =
   "struct VS_INPUT\n"
   "{\n"
   "   float4 Position  : POSITION0;\n"
   "   float2 TexCoord  : TEXCOORD0;\n"
   "   float4 Color     : TEXCOORD1;\n"
   "};\n"
   "struct VS_OUTPUT\n"
   "{\n"
   "   float4 Position  : POSITION0;\n"
   "   float4 Color     : COLOR0;\n"
   "   float2 TexCoord  : TEXCOORD0;\n"
   "};\n"
   "\n"
   "float4x4 projview_matrix;\n"
   "\n"
   "VS_OUTPUT vs_main(VS_INPUT Input)\n"
   "{\n"
   "   VS_OUTPUT Output;\n"
   "   Output.Position = mul(Input.Position, projview_matrix);\n"
   "   Output.Color = Input.Color;\n"
   "   Output.TexCoord = Input.TexCoord;\n"
   "   return Output;\n"
   "}\n";

static const char *hlsl_pixel_source =
   "texture tex;\n"
   "sampler2D s = sampler_state {\n"
   "   texture = <tex>;\n"
   "};\n"
   "float3 tint;\n"
   "float4 ps_main(VS_OUTPUT Input) : COLOR0\n"
   "{\n"
   "   float4 pixel = tex2D(s, Input.TexCoord.xy);\n"
   "   pixel.r *= tint.r;\n"
   "   pixel.g *= tint.g;\n"
   "   pixel.b *= tint.b;\n"
   "   return pixel;\n"
   "}\n";
#endif

#ifdef GLSL
/*
static const char *glsl_vertex_source =
   "attribute vec4 pos;\n"
   "attribute vec4 color;\n"
   "attribute vec2 texcoord;\n"
   "uniform mat4 projview_matrix;\n"
   "varying vec4 varying_color;\n"
   "varying vec2 varying_texcoord;\n"
   "void main()\n"
   "{\n"
   "  varying_color = color;\n"
   "  varying_texcoord = texcoord;\n"
   "  gl_Position = projview_matrix * pos;\n"
   "}\n";

static const char *glsl_pixel_source =
   "uniform sampler2D tex;\n"
   "uniform vec3 tint;\n"
   "varying vec4 varying_color;\n"
   "varying vec2 varying_texcoord;\n"
   "void main()\n"
   "{\n"
   "  vec4 tmp = varying_color * texture2D(tex, varying_texcoord);\n"
   "  tmp.r *= tint.r;\n"
   "  tmp.g *= tint.g;\n"
   "  tmp.b *= tint.b;\n"
   "  gl_FragColor = tmp;\n"
   "}\n";
*/
	static const char *glsl_pixel_source =
#ifdef IPHONE
	"precision mediump float;\n"
#endif
	"uniform bool use_tex;\n"
	"uniform sampler2D tex;\n"
	"uniform bool use_tex_matrix;\n"
	"uniform mat4 tex_matrix;\n"
	"varying vec4 varying_color;\n"
	"varying vec2 varying_texcoord;\n"
	"void main()\n"
	"{\n"
	"  vec4 tmp = varying_color;\n"
	"  vec4 coord = vec4(varying_texcoord, 0.0, 1.0);\n"
	"  if (use_tex_matrix) {\n"
	"     coord = coord * tex_matrix;\n"
	"     vec4 sample = texture2D(tex, coord.st);\n"
	"     tmp *= sample;\n"
	"  }\n"
	"  else if (use_tex) {\n"
	"     vec4 sample = texture2D(tex, coord.st);\n"
	"     tmp *= sample;\n"
	"  }\n"
	"  gl_FragColor = tmp;\n"
	"}\n";
		static const char *glsl_vertex_source =
		"attribute vec4 pos;\n"
		"attribute vec4 color;\n"
		"attribute vec2 texcoord;\n"
		"uniform mat4 projview_matrix;\n"
		"varying vec4 varying_color;\n"
		"varying vec2 varying_texcoord;\n"
		"void main()\n"
		"{\n"
		"   varying_color = color;\n"
		"   varying_texcoord = texcoord;\n"
#ifndef __linux__
		"   gl_PointSize = 1.0;\n"
#endif
		"   gl_Position = projview_matrix * pos;\n"
		"}\n";
#endif

#if defined HLSL && !defined CG
#include <allegro5/allegro_direct3d.h>
#include <d3d9.h>
#include <d3dx9.h>

#define A5V_FVF (D3DFVF_XYZ | D3DFVF_TEX2 | D3DFVF_TEXCOORDSIZE2(0) | D3DFVF_TEXCOORDSIZE4(1))

void drawD3D(ALLEGRO_VERTEX *v, int start, int count)
{
   ALLEGRO_DISPLAY *display = al_get_current_display();
   LPDIRECT3DDEVICE9 device = al_get_d3d_device(display);

   device->SetFVF(A5V_FVF);

   device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, count / 3,
      &v[start].x, sizeof(ALLEGRO_VERTEX));
}
#endif

int main(int argc, char **argv)
{
   ALLEGRO_DISPLAY *display;
   ALLEGRO_BITMAP *bmp;
   ALLEGRO_SHADER *shader;

   (void)argc;
   (void)argv;

   al_init();
   al_install_keyboard();
   al_init_image_addon();
   al_init_primitives_addon();

   al_set_new_display_flags(ALLEGRO_USE_PROGRAMMABLE_PIPELINE | EX_SHADER_FLAGS);

   display = al_create_display(640, 480);

   bmp = al_load_bitmap("data/mysha.pcx");

   shader = al_create_shader(PLATFORM);
   if (!shader) {
      fprintf(stderr, "Could not create shader\n");
      return 1;
   }

   if (!al_attach_shader_source(shader, ALLEGRO_VERTEX_SHADER, vsource_name)) {
      fprintf(stderr, "%s\n", al_get_shader_log(shader));
      return 1;
   }
   if (!al_attach_shader_source(shader, ALLEGRO_PIXEL_SHADER, psource_name)) {
      fprintf(stderr, "%s\n", al_get_shader_log(shader));
      return 1;
   }

   if (!al_link_shader(shader)) {
      fprintf(stderr, "%s\n", al_get_shader_log(shader));
      return 1;
   }

#if defined GLSL
   al_set_opengl_program_object(display, al_get_opengl_program_object(shader));
#elif defined HLSL
   al_set_direct3d_effect(display, al_get_direct3d_effect(shader));
#endif
      
   float tints[12] = {
      4.0, 0.0, 1.0,
      0.0, 4.0, 1.0,
      1.0, 0.0, 4.0,
      4.0, 4.0, 1.0
   };

   while (1) {
      ALLEGRO_KEYBOARD_STATE s;
      al_get_keyboard_state(&s);
      if (al_key_down(&s, ALLEGRO_KEY_ESCAPE))
         break;

      al_clear_to_color(al_map_rgb(140, 40, 40));

      al_set_shader_sampler(shader, "tex", bmp, 0);
      al_set_shader_float_vector(shader, "tint", 3, &tints[0], 1);
      al_use_shader(shader, true);
      al_draw_bitmap(bmp, 0, 0, 0);
      al_use_shader(shader, false);

      al_set_shader_sampler(shader, "tex", bmp, 0);
      al_set_shader_float_vector(shader, "tint", 3, &tints[3], 1);
      al_use_shader(shader, true);
      al_draw_bitmap(bmp, 320, 0, 0);
      al_use_shader(shader, false);
      
      al_set_shader_sampler(shader, "tex", bmp, 0);
      al_set_shader_float_vector(shader, "tint", 3, &tints[6], 1);
      al_use_shader(shader, true);
      al_draw_bitmap(bmp, 0, 240, 0);
      al_use_shader(shader, false);
     
      al_use_shader(shader, true);
      ALLEGRO_COLOR col = al_map_rgba(128, 128, 0, 128);
      ALLEGRO_VERTEX v[4];
      v[0].x = 5;
      v[0].y = 5;
      v[0].z = 0;
      v[0].color = col;
      v[1].x = 300;
      v[1].y = 5;
      v[1].z = 0;
      v[1].color = col;
      v[2].x = 5;
      v[2].y = 300;
      v[2].z = 0;
      v[2].color = col;
      v[3].x = 300;
      v[3].y = 300;
      v[3].z = 0;
      v[3].color = col;
      //al_draw_filled_rectangle(5, 5, 270, 270, al_map_rgba(128, 128, 0, 128));
      al_draw_prim(v, 0, 0, 0, 4, ALLEGRO_PRIM_TRIANGLE_STRIP);
      al_use_shader(shader, false);
      
      /* Draw the last one transformed */
      ALLEGRO_TRANSFORM trans, backup;
      al_copy_transform(&backup, al_get_current_transform());
      al_identity_transform(&trans);
      al_translate_transform(&trans, 320, 240);
      al_set_shader_sampler(shader, "tex", bmp, 0);
      al_set_shader_float_vector(shader, "tint", 3, &tints[9], 1);
      al_use_shader(shader, true);
      al_use_transform(&trans);
      al_draw_bitmap(bmp, 0, 0, 0);
      al_use_transform(&backup);
      al_use_shader(shader, false);

      al_flip_display();

      al_rest(0.01);
   }

   al_destroy_shader(shader);

   return 0;
}