00001 #ifndef RC_RENDERER_H
00002 #define RC_RENDERER_H
00003
00004 #define RC_MAX_TEXTURE_SLOTS 8
00005 #define RC_MAX_TEXTURE_NAME 256
00006
00007
00008
00009
00010
00012 typedef enum {
00013
00014 UNIFORM_INT32 = 0,
00015 UNIFORM_FLOAT32,
00016
00017 UNIFORM_TYPE_LAST
00018
00019 } UniformType_t;
00020
00022 typedef enum {
00023
00024 ATTRIB_INT8 = 0,
00025 ATTRIB_UINT8,
00026 ATTRIB_INT16,
00027 ATTRIB_UINT16,
00028 ATTRIB_INT32,
00029 ATTRIB_UINT32,
00030 ATTRIB_FLOAT32,
00031 ATTRIB_FLOAT64,
00032
00033 ATTRIB_TYPE_LAST
00034
00035 } AttributeType_t;
00036
00037
00038
00045 typedef enum {
00046
00047 USAGE_STATIC = 0,
00048 USAGE_DYNAMIC,
00049 USAGE_STREAM,
00050
00051 USAGE_LAST
00052
00053 } AttributeUsage_t;
00054
00055
00056
00058 typedef enum {
00059
00060 TEXTURE_FORMAT_RGBA8 = 4,
00061 TEXTURE_FORMAT_RGB8 = 3,
00062 TEXTURE_FORMAT_GRAY8 = 1,
00063 TEXTURE_FORMAT_RGBA16 = 8,
00064 TEXTURE_FORMAT_RGB16 = 6,
00065 TEXTURE_FORMAT_GRAY16 = 2,
00066 TEXTURE_FORMAT_DEPTH24 = 10,
00067
00068 TEXTURE_FORMAT_LAST
00069
00070 } TextureFormat_t;
00071
00073 typedef enum {
00074
00075 TEXTURE_FILTER_NEAREST = 0,
00076 TEXTURE_FILTER_BILINEAR,
00077 TEXTURE_FILTER_TRILINEAR,
00078
00079 TEXTURE_FILTER_LAST
00080
00081 } TextureFilter_t;
00082
00084 typedef enum {
00085
00086 TEXTURE_WRAP_CLAMP = 0,
00087 TEXTURE_WRAP_REPEAT,
00088 TEXTURE_WRAP_MIRRORED_REPEAT,
00089
00090 TEXTURE_WRAP_LAST
00091
00092 } TextureWrap_t;
00093
00094
00095
00097 typedef enum {
00098
00099 CMP_NEVER = 0,
00100 CMP_LESS,
00101 CMP_EQUAL,
00102 CMP_LEQUAL,
00103 CMP_GREATER,
00104 CMP_NOTEQUAL,
00105 CMP_GEQUAL,
00106 CMP_ALWAYS,
00107
00108 CMP_LAST
00109
00110 } StateCompare_t;
00111
00113 typedef enum {
00114
00115 SB_ZERO = 0,
00116 SB_ONE,
00117 SB_SRC_COLOR,
00118 SB_ONE_MINUS_SRC_COLOR,
00119 SB_SRC_ALPHA,
00120 SB_ONE_MINUS_SRC_ALPHA,
00121 SB_DST_ALPHA,
00122 SB_ONE_MINUS_DST_ALPHA,
00123
00124 SB_LAST
00125
00126 } StateSrcBlend_t;
00127
00129 typedef enum {
00130
00131 DB_ZERO = 0,
00132 DB_ONE,
00133 DB_DST_COLOR,
00134 DB_ONE_MINUS_DST_COLOR,
00135 DB_SRC_ALPHA_SATURATE,
00136 DB_ONE_MINUS_SRC_ALPHA,
00137 DB_DST_ALPHA,
00138 DB_ONE_MINUS_DST_ALPHA,
00139
00140 DB_LAST
00141
00142 } StateDstBlend_t;
00143
00144
00146 typedef enum {
00147
00148 CULL_FRONT = 0,
00149 CULL_BACK,
00150 CULL_FRONT_AND_BACK,
00151
00152 CULL_LAST
00153
00154 } StateCulling_t;
00155
00156
00157
00158
00160 typedef struct {
00161
00162 u32 max_render_targets;
00163
00164 u32 max_vertices;
00165 u32 max_indices;
00166
00167 u32 max_index_type_size;
00168
00169 u32 max_texture_size;
00170 u32 max_texture_units;
00171 u32 max_cubemap_size;
00172
00173 u32 max_viewport_size[2];
00174
00175 u32 max_vertex_attributes;
00176 u32 max_uniforms;
00177
00178 } RendererLimits_t;
00179
00180
00181
00182
00183
00184
00185 class Uniform;
00186
00187
00188
00189 class Renderer {
00190
00191 public:
00192
00193 Renderer();
00194
00195 virtual ~Renderer();
00196
00197 virtual void init() = 0;
00198
00199 public:
00200
00201
00202
00203 virtual void enqueue(
00204 Geometry *mesh
00205 ) = 0;
00206
00207 virtual void renderQueued() = 0;
00208
00210 virtual void render(
00211 Geometry *mesh
00212 ) = 0;
00213
00218 virtual void swapBuffers() = 0;
00219
00220
00221
00222 virtual void setShaderProgram(
00223 ShaderProgram *shader_program
00224 ) = 0;
00225
00226 virtual bool loadShaderProgram(
00227 ShaderProgram *shader_program,
00228 char *desc,
00229 char *prefix
00230 ) = 0;
00231
00232 virtual void unloadShaderProgram(
00233 ShaderProgram *shader_program
00234 ) = 0;
00235
00236
00237 virtual void setAttributes(
00238 VertexArray *vertex_array
00239 ) = 0;
00240
00241
00242 virtual void setUniform(
00243 Uniform *uniform
00244 ) = 0;
00245
00246 virtual bool getShaderHasUniform(
00247 ShaderProgram *shader_program,
00248 const char *name
00249 ) = 0;
00250
00251
00252
00253 virtual bool loadRenderTarget(
00254 RenderTarget *target,
00255 u32 n_textures,
00256 bool include_depth_buffer,
00257 bool include_stencil_buffer
00258 ) = 0;
00259
00260 virtual void unloadRenderTarget(
00261 RenderTarget *target
00262 ) = 0;
00263
00264 virtual bool shareDepthBuffer(
00265 RenderTarget *dst,
00266 RenderTarget *src
00267 ) = 0;
00268
00269 virtual void loadTexture(
00270 Texture *texture,
00271 u8 *pixels,
00272 u32 width,
00273 u32 height,
00274 TextureFormat_t format,
00275 bool generate_mipmaps,
00276 TextureFilter_t filter,
00277 TextureWrap_t wrap
00278 ) = 0;
00279
00280 virtual void unloadTexture(
00281 Texture *texture
00282 ) = 0;
00283
00284 virtual void loadCubeMap(
00285 CubeMap *cubemap,
00286 u8 **pixels,
00287 u32 width,
00288 u32 height,
00289 u32 bpp
00290 ) = 0;
00291
00292 virtual void unloadCubeMap(
00293 CubeMap *cubemap
00294 ) = 0;
00295
00296 virtual void loadVertexArray(
00297 VertexArray *vertex_array,
00298 void *new_array,
00299 u32 n,
00300 AttributeUsage_t usage
00301 ) = 0;
00302
00303 virtual void unloadVertexArray(
00304 VertexArray *vertex_array
00305 ) = 0;
00306
00307 virtual void reloadVertexArray(
00308 VertexArray *vertex_array,
00309 void *new_array,
00310 u32 n
00311 ) = 0;
00312
00313 virtual void loadIndexArray(
00314 VertexArray *vertex_array,
00315 void *new_array,
00316 u32 n,
00317 AttributeUsage_t usage
00318 ) = 0;
00319
00320 virtual void unloadIndexArray(
00321 VertexArray *vertex_array
00322 ) = 0;
00323
00324 virtual void reloadIndexArray(
00325 VertexArray *vertex_array,
00326 void *new_array,
00327 u32 n
00328 ) = 0;
00329
00330
00331
00332 virtual void setRenderState(
00333 RenderState *render_state
00334 ) = 0;
00335
00336 virtual void setViewport(
00337 i32 x,
00338 i32 y,
00339 u32 width,
00340 u32 height
00341 ) = 0;
00342
00343 virtual void getViewportDimensions(
00344 u32 *width,
00345 u32 *height
00346 ) = 0;
00347
00348 virtual void setRenderTarget(
00349 RenderTarget *target
00350 ) = 0;
00351
00352 virtual void setClearColor(
00353 vec4f color
00354 ) = 0;
00355
00356 virtual void setClearDepth(
00357 f32 depth
00358 ) = 0;
00359
00360 virtual void setClearStencil(
00361 i32 stencil
00362 ) = 0;
00363
00364 virtual void clearColor() = 0;
00365
00366 virtual void clearDepth() = 0;
00367
00368 virtual void clearStencil() = 0;
00369
00370 virtual void flush() = 0;
00371
00372 virtual void finish() = 0;
00373
00374
00375
00376 virtual void setMatrices(
00377 Camera *camera
00378 ) = 0;
00379
00380
00381
00383 RendererLimits_t getLimits() { return limits; }
00384
00385
00386 virtual void endFrame() = 0;
00387
00388 virtual void produceScreenshot(
00389 char *filename
00390 ) = 0;
00391
00392 virtual void ensure() = 0;
00393
00394
00395
00396 protected:
00397
00398 ShaderProgram *active_shader_program;
00399
00400 RenderState *active_render_state;
00401
00402
00403
00404
00405 mat4f world;
00406 mat4f worldInverse;
00407
00408
00409 mat4f view;
00410 mat4f viewInverse;
00411
00412
00413 mat4f projection;
00414 mat4f projectionInverse;
00415
00416
00417 mat4f viewProjection;
00418 mat4f viewProjectionInverse;
00419
00420 i32 viewport_offset[2];
00421 u32 viewport_size[2];
00422
00423 bool take_screenshot;
00424 char screenshot_filename[FILENAME_MAX - 1];
00425
00426
00427 RendererLimits_t limits;
00428
00429
00430
00431
00432 };
00433
00434
00435 extern Renderer *renderer;
00436
00437 #endif
00438