@@ -67,6 +67,46 @@ static void gl2gears_setup_draw(GLuint program, const OgxDrawData *draw_data,
6767 GX_SetTevOp (GX_TEVSTAGE0 , GX_PASSCLR );
6868}
6969
70+ typedef struct {
71+ GLint mvp_loc ;
72+ GLint tex_sampler_loc ;
73+ } CubeTexData ;
74+
75+ static void cube_tex_setup_draw (GLuint program , const OgxDrawData * draw_data ,
76+ void * user_data )
77+ {
78+ CubeTexData * data = user_data ;
79+ float m [16 ];
80+ glGetUniformfv (program , data -> mvp_loc , m );
81+ GLint texture_unit ;
82+ glGetUniformiv (program , data -> tex_sampler_loc , & texture_unit );
83+ ogx_set_mvp_matrix (m );
84+
85+ uint8_t tex_map = GX_TEXMAP0 ;
86+ uint8_t tex_coord = GX_TEXCOORD0 ;
87+ uint8_t input_coordinates = GX_TG_TEX0 ;
88+ uint8_t stage = GX_TEVSTAGE0 ;
89+ GXTexObj * texture ;
90+ texture = ogx_shader_get_texobj (texture_unit );
91+ GX_LoadTexObj (texture , tex_map );
92+ GX_SetNumChans (1 );
93+ GX_SetChanCtrl (GX_COLOR0A0 , GX_DISABLE , GX_SRC_REG , GX_SRC_VTX ,
94+ 0 , GX_DF_CLAMP , GX_AF_NONE );
95+
96+ // In data: c: Texture Color b: raster value, Operation: b*c
97+ GX_SetTevColorIn (stage , GX_CC_ZERO , GX_CC_RASC , GX_CC_TEXC , GX_CC_CPREV );
98+ GX_SetTevAlphaIn (stage , GX_CA_ZERO , GX_CA_RASA , GX_CA_TEXA , GX_CA_APREV );
99+ GX_SetTevColorOp (stage , GX_TEV_ADD , GX_TB_ZERO , GX_CS_SCALE_1 , GX_TRUE ,
100+ GX_TEVPREV );
101+ GX_SetTevAlphaOp (stage , GX_TEV_ADD , GX_TB_ZERO , GX_CS_SCALE_1 , GX_TRUE ,
102+ GX_TEVPREV );
103+ GX_SetTexCoordGen (tex_coord , GX_TG_MTX2x4 , input_coordinates , GX_IDENTITY );
104+
105+ GX_SetNumTevStages (1 );
106+ GX_SetTevOrder (stage , tex_coord , tex_map , GX_COLOR0A0 );
107+ GX_SetNumTexGens (1 );
108+ }
109+
70110static bool shader_compile (GLuint shader )
71111{
72112 uint32_t source_hash = ogx_shader_get_source_hash (shader );
@@ -82,6 +122,15 @@ static bool shader_compile(GLuint shader)
82122 ogx_shader_add_attributes (shader , 2 ,
83123 "position" , GL_FLOAT_VEC3 , GX_VA_POS ,
84124 "normal" , GL_FLOAT_VEC3 , GX_VA_NRM );
125+ } else if (source_hash == 0x53560768 ) {
126+ /* cube_tex.cpp vertex shader */
127+ ogx_shader_add_uniforms (shader , 2 ,
128+ "MVP" , GL_FLOAT_MAT4 ,
129+ "myTextureSampler" , GL_SAMPLER_2D );
130+ ogx_shader_add_attributes (shader , 3 ,
131+ "vertexPosition_modelspace" , GL_FLOAT_VEC3 , GX_VA_POS ,
132+ "vertexUV" , GL_FLOAT_VEC2 , GX_VA_TEX0 ,
133+ "vertexColor" , GL_FLOAT_VEC4 , GX_VA_CLR0 );
85134 }
86135}
87136
@@ -99,11 +148,18 @@ static GLenum link_program(GLuint program)
99148 data -> light_pos_loc = glGetUniformLocation (program , "LightSourcePosition" );
100149 ogx_shader_program_set_user_data (program , data , free );
101150 ogx_shader_program_set_setup_draw_cb (program , gl2gears_setup_draw );
151+ } else if (vertex_shader_hash == 0x53560768 ) {
152+ /* cube_tex.cpp vertex shader */
153+ CubeTexData * data = calloc (1 , sizeof (CubeTexData ));
154+ data -> mvp_loc = glGetUniformLocation (program , "MVP" );
155+ data -> tex_sampler_loc = glGetUniformLocation (program , "myTextureSampler" );
156+ ogx_shader_program_set_user_data (program , data , free );
157+ ogx_shader_program_set_setup_draw_cb (program , cube_tex_setup_draw );
102158 }
103159 return GL_NO_ERROR ;
104160}
105161
106- const OgxProgramProcessor s_processor = {
162+ static const OgxProgramProcessor s_processor = {
107163 .compile_shader = shader_compile ,
108164 .link_program = link_program ,
109165};
0 commit comments