Revision: 15217
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15217
Author:   blendix
Date:     2008-06-13 23:24:21 +0200 (Fri, 13 Jun 2008)

Log Message:
-----------
Apricot Branch: GLSL
====================

* Added support for lamps and shaders. All material diffuse and
  specular shaders are supported, for lamps especially area light
  support is not there yet.

* Added support for these GLSL shaders in the game engine, though
  it is incomplete and somewhat of a hack. Specifically all the
  variables are completely static, which means moving lights, or
  animating material properties will not work.

* Enabling GLSL shaders is now different. They work in textured
  drawmode, and can be enabled in the Game menu with the option
  "Blender GLSL Materials"

Known issues:
* The GLSL shaders don't always update correct on light changes.
* The game player appears to crash with these GLSL shaders, while
  regular blender works fine.

Modified Paths:
--------------
    branches/apricot/source/blender/blenkernel/BKE_colortools.h
    branches/apricot/source/blender/blenkernel/BKE_global.h
    branches/apricot/source/blender/blenkernel/BKE_node.h
    branches/apricot/source/blender/blenkernel/intern/DerivedMesh.c
    branches/apricot/source/blender/blenkernel/intern/colortools.c
    branches/apricot/source/blender/blenkernel/intern/node.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.c
    branches/apricot/source/blender/makesdna/DNA_userdef_types.h
    branches/apricot/source/blender/nodes/intern/SHD_nodes/SHD_curves.c
    branches/apricot/source/blender/src/drawobject.c
    branches/apricot/source/blender/src/header_info.c
    branches/apricot/source/blender/src/previewrender.c
    branches/apricot/source/blender/src/space.c
    branches/apricot/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
    branches/apricot/source/gameengine/BlenderRoutines/SConscript
    branches/apricot/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    branches/apricot/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
    branches/apricot/source/gameengine/Converter/KX_BlenderSceneConverter.h
    branches/apricot/source/gameengine/Converter/SConscript
    branches/apricot/source/gameengine/GamePlayer/common/SConscript
    branches/apricot/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
    branches/apricot/source/gameengine/GamePlayer/ghost/GPG_Application.h
    branches/apricot/source/gameengine/GamePlayer/ghost/SConscript
    branches/apricot/source/gameengine/Ketsji/BL_Material.cpp
    branches/apricot/source/gameengine/Ketsji/BL_Material.h
    branches/apricot/source/gameengine/Ketsji/CMakeLists.txt
    branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.h
    branches/apricot/source/gameengine/Ketsji/KX_GameObject.cpp
    branches/apricot/source/gameengine/Ketsji/KX_ISceneConverter.h
    branches/apricot/source/gameengine/Ketsji/Makefile
    branches/apricot/source/gameengine/Ketsji/SConscript
    branches/apricot/source/gameengine/Rasterizer/RAS_CameraData.h
    branches/apricot/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
    branches/apricot/source/gameengine/Rasterizer/SConscript

Added Paths:
-----------
    branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.cpp
    branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.h

Modified: branches/apricot/source/blender/blenkernel/BKE_colortools.h
===================================================================
--- branches/apricot/source/blender/blenkernel/BKE_colortools.h 2008-06-13 
21:07:46 UTC (rev 15216)
+++ branches/apricot/source/blender/blenkernel/BKE_colortools.h 2008-06-13 
21:24:21 UTC (rev 15217)
@@ -57,6 +57,7 @@
 void                           curvemapping_premultiply(struct CurveMapping 
*cumap, int restore);
 int                                    curvemapping_RGBA_does_something(struct 
CurveMapping *cumap);
 void                           curvemapping_initialize(struct CurveMapping 
*cumap);
+void                           curvemapping_table_RGBA(struct CurveMapping 
*cumap, float **array, int *size);
 
 #endif
 

Modified: branches/apricot/source/blender/blenkernel/BKE_global.h
===================================================================
--- branches/apricot/source/blender/blenkernel/BKE_global.h     2008-06-13 
21:07:46 UTC (rev 15216)
+++ branches/apricot/source/blender/blenkernel/BKE_global.h     2008-06-13 
21:24:21 UTC (rev 15217)
@@ -220,6 +220,7 @@
 #define G_FILE_GAME_MAT                         (1 << 12)
 #define G_FILE_DIAPLAY_LISTS    (1 << 13)
 #define G_FILE_SHOW_PHYSICS             (1 << 14)
+#define G_FILE_GAME_MAT_GLSL    (1 << 15)
 
 /* G.windowstate */
 #define G_WINDOWSTATE_USERDEF          0

Modified: branches/apricot/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/apricot/source/blender/blenkernel/BKE_node.h       2008-06-13 
21:07:46 UTC (rev 15216)
+++ branches/apricot/source/blender/blenkernel/BKE_node.h       2008-06-13 
21:24:21 UTC (rev 15217)
@@ -258,7 +258,7 @@
 extern void (*node_shader_lamp_loop)(struct ShadeInput *, struct ShadeResult 
*);
 void                   set_node_shader_lamp_loop(void (*lamp_loop_func)(struct 
ShadeInput *, struct ShadeResult *));
 
-struct GPUMaterial *ntreeShaderCreateGPU(struct bNodeTree *tree);
+void                   ntreeGPUMaterialNodes(struct bNodeTree *ntree, struct 
GPUMaterial *mat);
 
 
 /* ************** COMPOSITE NODES *************** */

Modified: branches/apricot/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/DerivedMesh.c     
2008-06-13 21:07:46 UTC (rev 15216)
+++ branches/apricot/source/blender/blenkernel/intern/DerivedMesh.c     
2008-06-13 21:24:21 UTC (rev 15217)
@@ -3119,11 +3119,11 @@
 
                if (mf->v4) {
                        v4= &mvert[mf->v4];
-                       CalcNormFloat4(v1->co, v2->co, v3->co, v4->co, fno);
+                       CalcNormFloat4(v4->co, v3->co, v2->co, v1->co, fno);
                }
                else {
                        v4= NULL;
-                       CalcNormFloat(v1->co, v2->co, v3->co, fno);
+                       CalcNormFloat(v3->co, v2->co, v1->co, fno);
                }
                
                if(mtface) {

Modified: branches/apricot/source/blender/blenkernel/intern/colortools.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/colortools.c      
2008-06-13 21:07:46 UTC (rev 15216)
+++ branches/apricot/source/blender/blenkernel/intern/colortools.c      
2008-06-13 21:24:21 UTC (rev 15217)
@@ -730,3 +730,24 @@
                        curvemap_make_table(cumap->cm+a, &cumap->clipr);
        }
 }
+
+void curvemapping_table_RGBA(CurveMapping *cumap, float **array, int *size)
+{
+       int a;
+       
+       *size = CM_TABLE+1;
+       *array = MEM_callocN(sizeof(float)*(*size)*4, "CurveMapping");
+       curvemapping_initialize(cumap);
+
+       for(a=0; a<*size; a++) {
+               if(cumap->cm[0].table)
+                       (*array)[a*4+0]= cumap->cm[0].table[a].y;
+               if(cumap->cm[1].table)
+                       (*array)[a*4+1]= cumap->cm[1].table[a].y;
+               if(cumap->cm[2].table)
+                       (*array)[a*4+2]= cumap->cm[2].table[a].y;
+               if(cumap->cm[3].table)
+                       (*array)[a*4+3]= cumap->cm[3].table[a].y;
+       }
+}
+

Modified: branches/apricot/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/node.c    2008-06-13 
21:07:46 UTC (rev 15216)
+++ branches/apricot/source/blender/blenkernel/intern/node.c    2008-06-13 
21:24:21 UTC (rev 15217)
@@ -2393,20 +2393,18 @@
                ns[i]->data= gs[i].link;
 }
 
-GPUMaterial *ntreeShaderCreateGPU(bNodeTree *ntree)
+void ntreeGPUMaterialNodes(bNodeTree *ntree, GPUMaterial *mat)
 {
        bNode *node;
        bNodeStack *stack;
        bNodeStack *nsin[MAX_SOCKET];   /* arbitrary... watch this */
        bNodeStack *nsout[MAX_SOCKET];  /* arbitrary... watch this */
        GPUNodeStack gpuin[MAX_SOCKET+1], gpuout[MAX_SOCKET+1];
-       GPUMaterial *mat;
 
        if((ntree->init & NTREE_EXEC_INIT)==0)
                ntreeBeginExecTree(ntree);
 
        stack= ntree->stack;
-       mat= GPU_material_construct_begin();
 
        for(node= ntree->nodes.first; node; node= node->next) {
                if(node->typeinfo->gpufunc) {
@@ -2419,14 +2417,7 @@
                /* groups not supported yet .. */
        }
 
-       if(!GPU_material_construct_end(mat)) {
-               GPU_material_free(mat);
-               mat= NULL;
-       }
-
        ntreeEndExecTree(ntree);
-
-       return mat;
 }
 
 /* **************** call to switch lamploop for material node ************ */

Modified: branches/apricot/source/blender/gpu/GPU_extensions.h
===================================================================
--- branches/apricot/source/blender/gpu/GPU_extensions.h        2008-06-13 
21:07:46 UTC (rev 15216)
+++ branches/apricot/source/blender/gpu/GPU_extensions.h        2008-06-13 
21:24:21 UTC (rev 15217)
@@ -33,6 +33,10 @@
 #ifndef GPU_EXTENSIONS_H
 #define GPU_EXTENSIONS_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /* GPU extensions support */
 
 struct Image;
@@ -50,7 +54,7 @@
 void GPU_extensions_init(void); /* call this before running any of the 
functions below */
 void GPU_extensions_exit(void);
 int GPU_extensions_minimum_support(void);
-void GPU_print_error(char *str);
+int GPU_print_error(char *str);
 
 /* GPU Texture
    - always returns unsigned char RGBA textures
@@ -136,5 +140,9 @@
        int totlayer;
 } GPUVertexAttribs;
 
+#ifdef __cplusplus
+}
 #endif
 
+#endif
+

Modified: branches/apricot/source/blender/gpu/GPU_material.h
===================================================================
--- branches/apricot/source/blender/gpu/GPU_material.h  2008-06-13 21:07:46 UTC 
(rev 15216)
+++ branches/apricot/source/blender/gpu/GPU_material.h  2008-06-13 21:24:21 UTC 
(rev 15217)
@@ -33,6 +33,10 @@
 #ifndef __GPU_MATERIAL__
 #define __GPU_MATERIAL__
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 struct Image;
 struct ImageUser;
 struct Material;
@@ -47,7 +51,7 @@
 typedef struct GPUNodeLink GPUNodeLink;
 typedef struct GPUMaterial GPUMaterial;
 
-/* Nodes */
+/* Functions to create GPU Materials nodes */
 
 typedef enum GPUType {
        GPU_NONE = 0,
@@ -72,6 +76,7 @@
 
 GPUNodeLink *GPU_attribute(int type, char *name);
 GPUNodeLink *GPU_uniform(float *num);
+GPUNodeLink *GPU_dynamic_uniform(float *num);
 GPUNodeLink *GPU_image(struct Image *ima, struct ImageUser *iuser);
 GPUNodeLink *GPU_texture(int size, float *pixels);
 GPUNodeLink *GPU_socket(GPUNodeStack *sock);
@@ -79,23 +84,27 @@
 GPUNode *GPU_link(GPUMaterial *mat, char *name, ...);
 GPUNode *GPU_stack_link(GPUMaterial *mat, char *name, GPUNodeStack *in, 
GPUNodeStack *out, ...);
 
-/* Material */
-
-GPUMaterial *GPU_material_construct_begin();
 void GPU_material_output_link(GPUMaterial *material, GPUNodeLink *link);
 void GPU_material_enable_alpha(GPUMaterial *material);
-GPUNodeLink *GPU_blender_material(GPUMaterial *mat, struct Material *ma);
-int GPU_material_construct_end(GPUMaterial *material);
 
+/* 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);
 void GPU_material_free(GPUMaterial *material);
 
-void GPU_material_bind(struct Object *ob, GPUMaterial *material);
+void GPU_material_bind(GPUMaterial *material);
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[][4], float 
viewmat[][4]);
 void GPU_material_unbind(GPUMaterial *material);
 
 void GPU_material_vertex_attributes(GPUMaterial *material,
        struct GPUVertexAttribs *attrib);
 
-GPUMaterial *GPU_material_from_blender(struct Material *ma);
+#ifdef __cplusplus
+}
+#endif
 
 #endif /*__GPU_MATERIAL__*/
 

Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.c    2008-06-13 
21:07:46 UTC (rev 15216)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c    2008-06-13 
21:24:21 UTC (rev 15217)
@@ -34,6 +34,7 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "DNA_customdata_types.h"
 #include "DNA_image_types.h"
 #include "DNA_listBase.h"
 
@@ -97,6 +98,8 @@
 
        void *ptr1, *ptr2;
 
+       int dynamic;
+
        int type;
        int users;
 
@@ -129,6 +132,7 @@
        int textarget;                  /* GL_TEXTURE_* */
 
        float vec[16];                  /* vector data */
+       float *dynamicvec;              /* vector data in case it is dynamic */
        GPUNodeLink *link;
        GPUTexture *tex;                /* input texture, only set at runtime */
        struct Image *ima;              /* image */
@@ -333,6 +337,26 @@
        }
 }
 
+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)
@@ -500,10 +524,10 @@
                        }
                        else if (input->samp == GPU_TEX_PIXEL) {
                                if (input->link && input->link->source)
-                                       codegen_convert_datatype(ds, 
input->link->source->type /* was GPU_VEC4 */, input->type,
+                                       codegen_convert_datatype(ds, 
input->link->source->type, input->type,
                                                "tmp", input->link->source->id);
                                else
-                                       codegen_convert_datatype(ds, 
input->link->source->type /* was GPU_VEC4 */, input->type,
+                                       codegen_convert_datatype(ds, 
input->link->source->type, input->type,
                                                "tex", input->texid);
                        }
                        else if ((input->samp == GPU_VEC_UNIFORM) ||
@@ -549,12 +573,12 @@
        code = BLI_dynstr_get_cstring(ds);
        BLI_dynstr_free(ds);
 
-       if(G.f & G_DEBUG) printf("%s\n", code);
+       //if(G.f & G_DEBUG) printf("%s\n", code);
 
        return code;
 }
 
-static char *code_generate_vertex(ListBase *nodes)
+static char *code_generate_vertex(ListBase *nodes, int profile)
 {
        DynStr *ds = BLI_dynstr_new();
        GPUNode *node;
@@ -564,8 +588,9 @@
        for (node=nodes->first; node; node=node->next) {
                for (input=node->inputs.first; input; input=input->next) {

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to