Revision: 15294 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15294 Author: blendix Date: 2008-06-21 12:33:12 +0200 (Sat, 21 Jun 2008)
Log Message: ----------- Apricot Branch: GLSL ==================== * Added initial support for shadow buffers, works in the 3d view and the game engine, but has known issues still: * Shadow buffers are made again for each 3d viewport unnecessarily. * No filtering. * There was a bug with some shaders going black, but can't reproduce it anymore? * Added support for layer lamps, though they're still always computed in the shader, this needs to be optimized. * Added support for animating lamp position/rotation in the game engine. * Fix issue with lamps giving negative light on the backside. * Fix issue with specular + orthographic camera. * Fix square spotlights. * Potential workaround for a bug in the nvidia drivers with shader linking. Modified Paths: -------------- branches/apricot/source/blender/blenkernel/intern/object.c branches/apricot/source/blender/blenloader/intern/readfile.c branches/apricot/source/blender/gpu/GPU_extensions.h branches/apricot/source/blender/gpu/GPU_material.h branches/apricot/source/blender/gpu/intern/gpu_codegen.c branches/apricot/source/blender/gpu/intern/gpu_codegen.h branches/apricot/source/blender/gpu/intern/gpu_extensions.c branches/apricot/source/blender/gpu/intern/gpu_material.c branches/apricot/source/blender/gpu/intern/material_shaders.glsl branches/apricot/source/blender/gpu/intern/material_shaders.glsl.c branches/apricot/source/blender/gpu/intern/material_vertex_shader.glsl branches/apricot/source/blender/gpu/intern/material_vertex_shader.glsl.c branches/apricot/source/blender/include/BDR_drawobject.h branches/apricot/source/blender/include/BSE_drawview.h branches/apricot/source/blender/makesdna/DNA_object_types.h branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_camera.c branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_geom.c branches/apricot/source/blender/src/buttons_shading.c branches/apricot/source/blender/src/drawobject.c branches/apricot/source/blender/src/drawview.c branches/apricot/source/blender/src/previewrender.c branches/apricot/source/blender/src/renderwin.c branches/apricot/source/gameengine/Converter/BL_BlenderDataConversion.cpp branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.cpp branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.h branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.cpp branches/apricot/source/gameengine/Ketsji/KX_KetsjiEngine.cpp branches/apricot/source/gameengine/Ketsji/KX_KetsjiEngine.h branches/apricot/source/gameengine/Ketsji/KX_Light.cpp branches/apricot/source/gameengine/Ketsji/KX_Light.h branches/apricot/source/gameengine/Ketsji/KX_Scene.cpp branches/apricot/source/gameengine/Ketsji/KX_Scene.h Modified: branches/apricot/source/blender/blenkernel/intern/object.c =================================================================== --- branches/apricot/source/blender/blenkernel/intern/object.c 2008-06-20 21:36:15 UTC (rev 15293) +++ branches/apricot/source/blender/blenkernel/intern/object.c 2008-06-21 10:33:12 UTC (rev 15294) @@ -112,6 +112,8 @@ #include "BPY_extern.h" +#include "GPU_material.h" + #include "blendef.h" /* Local function protos */ @@ -268,6 +270,7 @@ } if(ob->soft) sbFree(ob->soft); if(ob->fluidsimSettings) fluidsimSettingsFree(ob->fluidsimSettings); + if(ob->gpulamp) GPU_lamp_free(ob->gpulamp); } static void unlink_object__unlinkModifierLinks(void *userData, Object *ob, Object **obpoin) @@ -1215,6 +1218,7 @@ obn->vnode = NULL; #endif + obn->gpulamp = NULL; return obn; } Modified: branches/apricot/source/blender/blenloader/intern/readfile.c =================================================================== --- branches/apricot/source/blender/blenloader/intern/readfile.c 2008-06-20 21:36:15 UTC (rev 15293) +++ branches/apricot/source/blender/blenloader/intern/readfile.c 2008-06-21 10:33:12 UTC (rev 15294) @@ -3368,6 +3368,7 @@ ob->bb= NULL; ob->derivedDeform= NULL; ob->derivedFinal= NULL; + ob->gpulamp= NULL; } /* ************ READ SCENE ***************** */ Modified: branches/apricot/source/blender/gpu/GPU_extensions.h =================================================================== --- branches/apricot/source/blender/gpu/GPU_extensions.h 2008-06-20 21:36:15 UTC (rev 15293) +++ branches/apricot/source/blender/gpu/GPU_extensions.h 2008-06-21 10:33:12 UTC (rev 15294) @@ -72,6 +72,7 @@ GPUTexture *GPU_texture_create_1D(int w, float *pixels, int halffloat); GPUTexture *GPU_texture_create_2D(int w, int h, float *pixels, int halffloat); +GPUTexture *GPU_texture_create_depth(int w, int h); GPUTexture *GPU_texture_from_blender(struct Image *ima, struct ImageUser *iuser); void GPU_texture_free(GPUTexture *tex); @@ -92,7 +93,6 @@ int GPU_texture_opengl_height(GPUTexture *tex); void GPU_texture_coord_2f(GPUTexture *tex, float s, float t); -#if 0 /* GPU Framebuffer - this is a wrapper for an OpenGL framebuffer object (FBO). in practice multiple FBO's may be created, to get around limitations on the number @@ -108,7 +108,6 @@ void GPU_framebuffer_free(GPUFrameBuffer *fb); void GPU_framebuffer_restore(); -#endif /* GPU Shader - only for fragment shaders now Modified: branches/apricot/source/blender/gpu/GPU_material.h =================================================================== --- branches/apricot/source/blender/gpu/GPU_material.h 2008-06-20 21:36:15 UTC (rev 15293) +++ branches/apricot/source/blender/gpu/GPU_material.h 2008-06-21 10:33:12 UTC (rev 15294) @@ -41,16 +41,21 @@ struct ImageUser; struct Material; struct Object; +struct Lamp; struct bNode; +struct LinkNode; struct GPUVertexAttribs; struct GPUNode; struct GPUNodeLink; struct GPUNodeStack; struct GPUMaterial; +struct GPUTexture; +struct GPULamp; typedef struct GPUNode GPUNode; typedef struct GPUNodeLink GPUNodeLink; typedef struct GPUMaterial GPUMaterial; +typedef struct GPULamp GPULamp; /* Functions to create GPU Materials nodes */ @@ -64,9 +69,18 @@ GPU_MAT4 = 16, GPU_TEX1D = 1001, GPU_TEX2D = 1002, - GPU_ATTRIB = 2001 + GPU_ATTRIB = 3001 } GPUType; +typedef enum GPUBuiltin { + GPU_VIEW_MATRIX = 1, + GPU_OBJECT_MATRIX = 2, + GPU_INVERSE_VIEW_MATRIX = 4, + GPU_INVERSE_OBJECT_MATRIX = 8, + GPU_VIEW_POSITION = 16, + GPU_VIEW_NORMAL = 32 +} GPUBuiltin; + typedef struct GPUNodeStack { GPUType type; char *name; @@ -82,7 +96,9 @@ GPUNodeLink *GPU_dynamic_uniform(float *num); GPUNodeLink *GPU_image(struct Image *ima, struct ImageUser *iuser); GPUNodeLink *GPU_texture(int size, float *pixels); +GPUNodeLink *GPU_dynamic_texture(struct GPUTexture *tex); GPUNodeLink *GPU_socket(GPUNodeStack *sock); +GPUNodeLink *GPU_builtin(GPUBuiltin builtin); int GPU_link(GPUMaterial *mat, char *name, ...); int GPU_stack_link(GPUMaterial *mat, char *name, GPUNodeStack *in, GPUNodeStack *out, ...); @@ -92,13 +108,10 @@ /* High level functions to create and use GPU materials */ -#define GPU_PROFILE_GAME 0 -#define GPU_PROFILE_DERIVEDMESH 1 - -GPUMaterial *GPU_material_from_blender(struct Material *ma, int profile); +int GPU_material_from_blender(struct Material *ma); void GPU_material_free(GPUMaterial *material); -void GPU_material_bind(GPUMaterial *material); +void GPU_material_bind(GPUMaterial *material, int lay); void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float viewmat[][4]); void GPU_material_unbind(GPUMaterial *material); @@ -122,6 +135,18 @@ void GPU_shadeinput_set(GPUMaterial *mat, struct Material *ma, GPUShadeInput *shi); void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr); +/* Lamps */ + +int GPU_lamp_from_blender(struct Object *ob, struct Lamp *la); +void GPU_lamp_free(GPULamp *lamp); + +int GPU_lamp_has_shadow_buffer(GPULamp *lamp); +void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[][4], int *winsize, float winmat[][4]); +void GPU_lamp_shadow_buffer_unbind(GPULamp *lamp); + +void GPU_lamp_update(GPULamp *lamp, float obmat[][4]); +int GPU_lamp_shadow_layer(GPULamp *lamp); + #ifdef __cplusplus } #endif Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c =================================================================== --- branches/apricot/source/blender/gpu/intern/gpu_codegen.c 2008-06-20 21:36:15 UTC (rev 15293) +++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c 2008-06-21 10:33:12 UTC (rev 15294) @@ -68,11 +68,14 @@ /* structs and defines */ -#define GPU_VEC_UNIFORM 1 -#define GPU_TEX_PIXEL 2 -#define GPU_TEX_RAND 3 -#define GPU_ARR_UNIFORM 4 -#define GPU_S_ATTRIB 5 +typedef enum GPUDataSource { + GPU_SOURCE_VEC_UNIFORM, + GPU_SOURCE_ARRAY_UNIFORM, + GPU_SOURCE_BUILTIN, + GPU_SOURCE_TEX_PIXEL, + GPU_SOURCE_TEX, + GPU_SOURCE_ATTRIB +} GPUDataSource; static char* GPU_DATATYPE_STR[17] = {"", "float", "vec2", "vec3", "vec4", 0, 0, 0, 0, "mat3", 0, 0, 0, 0, 0, 0, "mat4"}; @@ -105,7 +108,11 @@ int type; int users; - struct GPUOutput *source; + GPUTexture *dynamictex; + + GPUBuiltin builtin; + + struct GPUOutput *output; }; typedef struct GPUOutput { @@ -124,7 +131,7 @@ int type; /* datatype */ int arraysize; /* number of elements in an array */ - int samp; + int source; /* data source */ int id; /* unique id as created by code generator */ int texid; /* number for multitexture */ @@ -137,11 +144,13 @@ float *dynamicvec; /* vector data in case it is dynamic */ GPUNodeLink *link; GPUTexture *tex; /* input texture, only set at runtime */ + int dynamictex; /* dynamic? */ struct Image *ima; /* image */ struct ImageUser *iuser;/* image user */ int attribtype; /* attribute type */ char attribname[32]; /* attribute name */ int attribfirst; /* this is the first one that is bound */ + GPUBuiltin builtin; /* builtin uniform */ } GPUInput; struct GPUPass { @@ -411,26 +420,6 @@ } } -static void codegen_convert_datatype_texco(DynStr *ds, int to, char *tmp, int id) -{ - char name[1024]; - - snprintf(name, sizeof(name), "%s%d", tmp, id); - - if (to == GPU_FLOAT) { - BLI_dynstr_printf(ds, "%s.x", name); - } - else if (to == GPU_VEC2) { - BLI_dynstr_printf(ds, "%s.xy", name); - } - else if (to == GPU_VEC3) { - BLI_dynstr_printf(ds, "%s.xyz", name); - } - else if (to == GPU_VEC4) { - BLI_dynstr_append(ds, name); - } -} - static int codegen_input_has_texture(GPUInput *input) { if (input->link) @@ -441,6 +430,24 @@ return input->tex != 0; } +char *GPU_builtin_name(GPUBuiltin builtin) +{ + if(builtin == GPU_VIEW_MATRIX) + return "unfviewmat"; + else if(builtin == GPU_OBJECT_MATRIX) + return "unfobmat"; + else if(builtin == GPU_INVERSE_VIEW_MATRIX) + return "unfinvviewmat"; + else if(builtin == GPU_INVERSE_OBJECT_MATRIX) + return "unfinvobmat"; + else if(builtin == GPU_VIEW_POSITION) + return "varposition"; + else if(builtin == GPU_VIEW_NORMAL) + return "varnormal"; + else + return ""; +} + static void codegen_set_unique_ids(ListBase *nodes) { GHash *bindhash, *definehash; @@ -461,7 +468,7 @@ /* set texid used for settings texture slot with multitexture */ if (codegen_input_has_texture(input) && - ((input->samp == GPU_TEX_RAND) || (input->samp == GPU_TEX_PIXEL))) { + ((input->source == GPU_SOURCE_TEX) || (input->source == GPU_SOURCE_TEX_PIXEL))) { if (input->link) { /* input is texture from buffer, assign only one texid per buffer to avoid sampling the same texture twice */ @@ -492,7 +499,7 @@ } /* make sure this pixel is defined exactly once */ - if (input->samp == GPU_TEX_PIXEL) { + if (input->source == GPU_SOURCE_TEX_PIXEL) { if(input->ima) { if (!BLI_ghash_haskey(definehash, input->ima)) { input->definetex = 1; @@ -522,27 +529,45 @@ { GPUNode *node; GPUInput *input; + char *name; + int builtins = 0; /* print uniforms */ for (node=nodes->first; node; node=node->next) { for (input=node->inputs.first; input; input=input->next) { - if ((input->samp == GPU_TEX_RAND) || (input->samp == GPU_TEX_PIXEL)) { + if ((input->source == GPU_SOURCE_TEX) || (input->source == GPU_SOURCE_TEX_PIXEL)) { /* create exactly one sampler for each texture */ if (codegen_input_has_texture(input) && input->bindtex) BLI_dynstr_printf(ds, "uniform %s samp%d;\n", (input->textarget == GL_TEXTURE_1D)? "sampler1D": "sampler2D", input->texid); } - else if (input->samp == GPU_VEC_UNIFORM) { + else if(input->source == GPU_SOURCE_BUILTIN) { + /* only define each builting uniform/varying once */ + if(!(builtins & input->builtin)) { + builtins |= input->builtin; + name = GPU_builtin_name(input->builtin); + + if(gpu_str_prefix(name, "unf")) { + BLI_dynstr_printf(ds, "uniform %s %s;\n", + GPU_DATATYPE_STR[input->type], name); + } + else { + BLI_dynstr_printf(ds, "varying %s %s;\n", + GPU_DATATYPE_STR[input->type], name); + } + } + } + else if (input->source == GPU_SOURCE_VEC_UNIFORM) { /* and create uniform vectors or matrices for all vectors */ BLI_dynstr_printf(ds, "uniform %s unf%d;\n", GPU_DATATYPE_STR[input->type], input->id); } - else if (input->samp == GPU_ARR_UNIFORM) { + else if (input->source == GPU_SOURCE_ARRAY_UNIFORM) { @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs