Commit: 38940662e540743a6a8da287390a02a9f3f76f6d
Author: Alexander Romanov
Date:   Tue Jul 14 18:48:54 2015 +0200
Branches: master
https://developer.blender.org/rB38940662e540743a6a8da287390a02a9f3f76f6d

Particle Info node support for GLSL mode and the internal render.

With this patch "Particle Info" node from Cycles works in GLSL and BI

Alexander (Blend4Web Team)

Reviewers: psy-fi
Note: moved particle info to object render instance instead of
shadeinput during review - Antony.

Differential Revision: https://developer.blender.org/D1313

===================================================================

M       release/scripts/startup/nodeitems_builtins.py
M       source/blender/editors/space_view3d/view3d_draw.c
M       source/blender/gpu/GPU_draw.h
M       source/blender/gpu/GPU_material.h
M       source/blender/gpu/intern/gpu_codegen.c
M       source/blender/gpu/intern/gpu_draw.c
M       source/blender/gpu/intern/gpu_material.c
M       source/blender/gpu/shaders/gpu_shader_material.glsl
M       source/blender/nodes/shader/nodes/node_shader_particle_info.c
M       source/blender/render/extern/include/RE_shader_ext.h
M       source/blender/render/intern/include/render_types.h
M       source/blender/render/intern/source/renderdatabase.c
M       source/blender/render/intern/source/shadeinput.c
M       source/blenderplayer/bad_level_call_stubs/stubs.c
M       source/gameengine/Ketsji/BL_BlenderShader.cpp

===================================================================

diff --git a/release/scripts/startup/nodeitems_builtins.py 
b/release/scripts/startup/nodeitems_builtins.py
index bee48de..cada125 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -141,6 +141,7 @@ shader_node_categories = [
         NodeItem("ShaderNodeTexture"),
         NodeItem("ShaderNodeGeometry"),
         NodeItem("ShaderNodeExtendedMaterial"),
+        NodeItem("ShaderNodeParticleInfo"),
         NodeItem("NodeGroupInput", poll=group_input_output_item_poll),
         ]),
     ShaderOldNodeCategory("SH_OUTPUT", "Output", items=[
diff --git a/source/blender/editors/space_view3d/view3d_draw.c 
b/source/blender/editors/space_view3d/view3d_draw.c
index 45d5b2f..d13dd31 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2191,7 +2191,9 @@ static void draw_dupli_objects_color(
                        }       
                        else {
                                copy_m4_m4(dob->ob->obmat, dob->mat);
+                               GPU_begin_dupli_object(dob);
                                draw_object(scene, ar, v3d, &tbase, 
dflag_dupli);
+                               GPU_end_dupli_object();
                        }
                }
                
diff --git a/source/blender/gpu/GPU_draw.h b/source/blender/gpu/GPU_draw.h
index 2e16068..a6bc5ff 100644
--- a/source/blender/gpu/GPU_draw.h
+++ b/source/blender/gpu/GPU_draw.h
@@ -45,6 +45,7 @@ struct Scene;
 struct View3D;
 struct RegionView3D;
 struct SmokeModifierData;
+struct DupliObject;
 
 /* OpenGL drawing functions related to shading. These are also
  * shared with the game engine, where there were previously
@@ -72,6 +73,9 @@ void GPU_end_object_materials(void);
 int GPU_enable_material(int nr, void *attribs);
 void GPU_disable_material(void);
 
+void GPU_begin_dupli_object(struct DupliObject *dob);
+void GPU_end_dupli_object(void);
+
 void GPU_material_diffuse_get(int nr, float diff[4]);
 bool GPU_material_use_matcaps_get(void);
 
diff --git a/source/blender/gpu/GPU_material.h 
b/source/blender/gpu/GPU_material.h
index b8a7fca..5995366 100644
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@ -62,6 +62,7 @@ typedef struct GPUNode GPUNode;
 typedef struct GPUNodeLink GPUNodeLink;
 typedef struct GPUMaterial GPUMaterial;
 typedef struct GPULamp GPULamp;
+typedef struct GPUParticleInfo GPUParticleInfo;
 
 /* Functions to create GPU Materials nodes */
 
@@ -90,6 +91,10 @@ typedef enum GPUBuiltin {
        GPU_OBCOLOR =               (1 << 6),
        GPU_AUTO_BUMPSCALE =        (1 << 7),
        GPU_CAMERA_TEXCO_FACTORS =  (1 << 8),
+       GPU_PARTICLE_SCALAR_PROPS = (1 << 9),
+       GPU_PARTICLE_LOCATION =     (1 << 10),
+       GPU_PARTICLE_VELOCITY =     (1 << 11),
+       GPU_PARTICLE_ANG_VELOCITY = (1 << 12),
 } GPUBuiltin;
 
 typedef enum GPUOpenGLBuiltin {
@@ -189,6 +194,7 @@ GPUNodeLink *GPU_texture(int size, float *pixels);
 GPUNodeLink *GPU_dynamic_texture(struct GPUTexture *tex, GPUDynamicType 
dynamictype, void *data);
 GPUNodeLink *GPU_builtin(GPUBuiltin builtin);
 GPUNodeLink *GPU_opengl_builtin(GPUOpenGLBuiltin builtin);
+void GPU_node_link_set_type(GPUNodeLink *link, GPUType type);
 
 bool GPU_link(GPUMaterial *mat, const char *name, ...);
 bool GPU_stack_link(GPUMaterial *mat, const char *name, GPUNodeStack *in, 
GPUNodeStack *out, ...);
@@ -208,7 +214,7 @@ void GPU_materials_free(void);
 
 bool GPU_lamp_override_visible(GPULamp *lamp, struct SceneRenderLayer *srl, 
struct Material *ma);
 void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double 
time, int mipmap, float viewmat[4][4], float viewinv[4][4], float 
cameraborder[4], bool scenelock);
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[4][4], 
float obcol[4], float autobumpscale);
+void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[4][4], 
float obcol[4], float autobumpscale, GPUParticleInfo *pi);
 void GPU_material_unbind(GPUMaterial *material);
 bool GPU_material_bound(GPUMaterial *material);
 struct Scene *GPU_material_scene(GPUMaterial *material);
@@ -308,6 +314,14 @@ void GPU_mist_update_values(int type, float start, float 
dist, float inten, floa
 void GPU_horizon_update_color(float color[3]);
 void GPU_ambient_update_color(float color[3]);
 
+typedef struct GPUParticleInfo
+{
+       float scalprops[4];
+       float location[3];
+       float velocity[3];
+       float angular_velocity[3];
+} GPUParticleInfo;
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/gpu/intern/gpu_codegen.c 
b/source/blender/gpu/intern/gpu_codegen.c
index 9440118..335342c 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -387,6 +387,14 @@ const char *GPU_builtin_name(GPUBuiltin builtin)
                return "unfobautobumpscale";
        else if (builtin == GPU_CAMERA_TEXCO_FACTORS)
                return "unfcameratexfactors";
+       else if (builtin == GPU_PARTICLE_SCALAR_PROPS)
+               return "unfparticlescalarprops";
+       else if (builtin == GPU_PARTICLE_LOCATION)
+               return "unfparticleco";
+       else if (builtin == GPU_PARTICLE_VELOCITY)
+               return "unfparticlevel";
+       else if (builtin == GPU_PARTICLE_ANG_VELOCITY)
+               return "unfparticleangvel";
        else
                return "";
 }
diff --git a/source/blender/gpu/intern/gpu_draw.c 
b/source/blender/gpu/intern/gpu_draw.c
index f706077..a925d44 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -56,6 +56,7 @@
 #include "DNA_scene_types.h"
 #include "DNA_smoke_types.h"
 #include "DNA_view3d_types.h"
+#include "DNA_particle_types.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -1411,6 +1412,7 @@ static struct GPUMaterialState {
        Material *gmatbuf_fixed[FIXEDMAT];
        Material *gboundmat;
        Object *gob;
+       DupliObject *dob;
        Scene *gscene;
        int glay;
        bool gscenelock;
@@ -1493,11 +1495,22 @@ static Material *gpu_active_node_material(Material *ma)
        return ma;
 }
 
+void GPU_begin_dupli_object(DupliObject *dob)
+{
+       GMS.dob = dob;
+}
+
+void GPU_end_dupli_object(void)
+{
+       GMS.dob = NULL;
+}
+
 void GPU_begin_object_materials(View3D *v3d, RegionView3D *rv3d, Scene *scene, 
Object *ob, bool glsl, bool *do_alpha_after)
 {
        Material *ma;
        GPUMaterial *gpumat;
        GPUBlendMode alphablend;
+       DupliObject *dob;
        int a;
        const bool gamma = BKE_scene_check_color_management_enabled(scene);
        const bool new_shading_nodes = BKE_scene_use_new_shading_nodes(scene);
@@ -1510,7 +1523,10 @@ void GPU_begin_object_materials(View3D *v3d, 
RegionView3D *rv3d, Scene *scene, O
 #endif
 
        /* initialize state */
+       /* DupliObject must be restored */
+       dob = GMS.dob;
        memset(&GMS, 0, sizeof(GMS));
+       GMS.dob = dob;
        GMS.lastmatnr = -1;
        GMS.lastretval = -1;
        GMS.lastalphablend = GPU_BLEND_SOLID;
@@ -1618,6 +1634,36 @@ void GPU_begin_object_materials(View3D *v3d, 
RegionView3D *rv3d, Scene *scene, O
        GPU_disable_material();
 }
 
+int GPU_get_particle_info(GPUParticleInfo *pi)
+{
+       ParticleData *p;
+       DupliObject *dob = GMS.dob;
+       int ind;
+       if(dob->particle_system) {
+               if(dob->persistent_id[0] < dob->particle_system->totpart)
+                       ind = dob->persistent_id[0];
+               else {
+                       ind = dob->particle_system->child[dob->persistent_id[0] 
- dob->particle_system->totpart].parent;
+               }
+               if (ind >= 0) {
+                       p = &dob->particle_system->particles[ind];
+
+                       pi->scalprops[0] = ind;
+                       pi->scalprops[1] = GMS.gscene->r.cfra - p->time;
+                       pi->scalprops[2] = p->lifetime;
+                       pi->scalprops[3] = p->size;
+
+                       copy_v3_v3(pi->location, p->state.co);
+                       copy_v3_v3(pi->velocity, p->state.vel);
+                       copy_v3_v3(pi->angular_velocity, p->state.ave);
+                       return 1;
+               }
+               else return 0;
+       }
+       else
+               return 0;
+}
+
 int GPU_enable_material(int nr, void *attribs)
 {
        GPUVertexAttribs *gattribs = attribs;
@@ -1680,14 +1726,20 @@ int GPU_enable_material(int nr, void *attribs)
                if (gattribs && GMS.gmatbuf[nr]) {
                        /* bind glsl material and get attributes */
                        Material *mat = GMS.gmatbuf[nr];
+                       GPUParticleInfo partile_info;
+
                        float auto_bump_scale;
 
                        gpumat = GPU_material_from_blender(GMS.gscene, mat);
                        GPU_material_vertex_attributes(gpumat, gattribs);
+
+                       if (GMS.dob)
+                               GPU_get_particle_info(&partile_info);
+
                        GPU_material_bind(gpumat, GMS.gob->lay, GMS.glay, 1.0, 
!(GMS.gob->mode & OB_MODE_TEXTURE_PAINT), GMS.gviewmat, GMS.gviewinv, 
GMS.gviewcamtexcofac, GMS.gscenelock);
 
                        auto_bump_scale = GMS.gob->derivedFinal != NULL ? 
GMS.gob->derivedFinal->auto_bump_scale : 1.0f;
-                       GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, 
GMS.gob->col, auto_bump_scale);
+                       GPU_material_bind_uniforms(gpumat, GMS.gob->obmat, 
GMS.gob->col, auto_bump_scale, &partile_info);
                        GMS.gboundmat = mat;
 
                        /* for glsl use alpha blend mode, unless it's set to 
solid and
diff --git a/source/blender/gpu/intern/gpu_material.c 
b/source/blender/gpu/intern/gpu_material.c
index bd17fb0..5db516d 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -112,6 +112,11 @@ struct GPUMaterial {
        int obcolloc, obautobumpscaleloc;
        int cameratexcofacloc;
 
+       int partscalarpropsloc;
+       int partcoloc;
+       int partvel;
+       int partangvel;
+
        ListBase lamps;
        bool bound;
 };
@@ -241,6 +246,14 @@ static int GPU_material_construct_end(GPUMaterial 
*material, const char *passnam
                        material->obautobumpscaleloc = 
GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_AUTO_BUMPSCALE));
                if (material->builtins & GPU_CAMERA_TEXCO_FACTORS)
                        material->cameratexcofacloc = 
GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_CAMERA_TEXCO_FACTORS));
+               if (material->builtins & GPU_PARTICLE_SCALAR_PROPS)
+                       material->partscalarpropsloc = 
GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_PARTICLE_SCALAR_PROPS));
+               if (material->builtins & GPU_PARTICLE_LOCATION)
+                       material->partcoloc = GPU_shader_get_uniform(shader, 
GPU_builtin_name(GPU_PARTICLE_LOCATION));
+               if (material->builtins & GPU_PARTICLE_VELOCITY)
+                       material->partvel = GPU_shader_get_uniform(shader, 
GPU_builtin_name(GPU_PARTICLE_VELOCITY));
+               if (material->builtins & GPU_PARTICLE_ANG_VELOCITY)
+                       material->partangvel = GPU_shader_get_uniform(shader, 
GPU_builtin_name(GPU_PARTICLE_ANG_VELOCITY));
                return 1;
        }
 
@@ -367,7 +380,7 @@ void GPU_material_bind(GPUMaterial *material, int oblay, 
int viewlay, double tim
        }
 }
 
-void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[4][4], 
float obcol[4], float autobumpscale)
+void GPU_material_bi

@@ 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