Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Romanov <a.romanov@blend4web.com>2016-01-23 15:27:36 +0300
committerAlexander Romanov <a.romanov@blend4web.com>2016-01-23 15:39:31 +0300
commita6aaaad9795e80af05e8281030107c32c6a1366b (patch)
tree187e682a49789f2ccfa459d905e4cee741b884d4 /source/blender/render
parente9452f909cdba368f54637cd0b15ff14d1c60cf3 (diff)
Vector Transform node support for GLSL mode and the internal renderer
The Vector Transform node is a useful node which is present in the Cycles renderer. {F144283} This patch implements the Vector Transform node for GLSL mode and the internal renderer. Example: {F273060} Alexander (Blend4Web Team) Reviewers: brecht, campbellbarton, sergey Reviewed By: campbellbarton, sergey Subscribers: psy-fi, duarteframos, RobM, lightbwk, sergey, AlexKowel, valentin_b4w, Evgeny_Rodygin, yurikovelenov Projects: #bf_blender:_next Differential Revision: https://developer.blender.org/D909
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h7
-rw-r--r--source/blender/render/extern/include/RE_shader_ext.h16
-rw-r--r--source/blender/render/intern/include/render_types.h4
-rw-r--r--source/blender/render/intern/include/renderdatabase.h1
-rw-r--r--source/blender/render/intern/source/renderdatabase.c22
-rw-r--r--source/blender/render/intern/source/shadeoutput.c28
6 files changed, 78 insertions, 0 deletions
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index 96ac8aa8c5a..ce0691b7632 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -363,6 +363,13 @@ bool RE_is_rendering_allowed(struct Scene *scene, struct Object *camera_override
bool RE_allow_render_generic_object(struct Object *ob);
+/* RE_updateRenderInstances flag */
+enum {
+ RE_OBJECT_INSTANCES_UPDATE_VIEW = (1 << 0),
+ RE_OBJECT_INSTANCES_UPDATE_OBMAT = (1 << 1),
+};
+void RE_updateRenderInstances(Render *re, int flag);
+
/******* defined in render_result.c *********/
bool RE_HasFakeLayer(RenderResult *res);
diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h
index f78c0aa8cb2..2b07ace26db 100644
--- a/source/blender/render/extern/include/RE_shader_ext.h
+++ b/source/blender/render/extern/include/RE_shader_ext.h
@@ -220,6 +220,22 @@ float RE_bake_make_derivative(struct ImBuf *ibuf, float *heights_buffer, const c
const float height_min, const float height_max,
const float fmult);
+enum {
+ RE_OBJECT_INSTANCE_MATRIX_OB,
+ RE_OBJECT_INSTANCE_MATRIX_OBINV,
+ RE_OBJECT_INSTANCE_MATRIX_LOCALTOVIEW,
+ RE_OBJECT_INSTANCE_MATRIX_LOCALTOVIEWINV,
+};
+
+const float (*RE_object_instance_get_matrix(struct ObjectInstanceRen *obi, int matrix_id))[4];
+
+enum {
+ RE_VIEW_MATRIX,
+ RE_VIEWINV_MATRIX,
+};
+
+const float (*RE_render_current_get_matrix(int matrix_id))[4];
+
#define BAKE_RESULT_OK 0
#define BAKE_RESULT_NO_OBJECTS 1
#define BAKE_RESULT_FEEDBACK_LOOP 2
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index 3569cb2c168..3b69c124753 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -353,6 +353,10 @@ typedef struct ObjectInstanceRen {
float mat[4][4], imat[4][4];
float nmat[3][3]; /* nmat is inverse mat tranposed */
+
+ float obmat[4][4], obinvmat[4][4];
+ float localtoviewmat[4][4], localtoviewinvmat[4][4];
+
short flag;
float dupliorco[3], dupliuv[2];
diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h
index 224974454e8..167ebc58030 100644
--- a/source/blender/render/intern/include/renderdatabase.h
+++ b/source/blender/render/intern/include/renderdatabase.h
@@ -119,6 +119,7 @@ struct ObjectInstanceRen *RE_addRenderInstance(
struct Render *re, struct ObjectRen *obr, struct Object *ob, struct Object *par,
int index, int psysindex, float mat[4][4], int lay, const struct DupliObject *dob);
void RE_makeRenderInstances(struct Render *re);
+void RE_updateRenderInstance(Render *re, ObjectInstanceRen *obi, int flag);
void RE_instance_rotate_ray_start(struct ObjectInstanceRen *obi, struct Isect *is);
void RE_instance_rotate_ray_dir(struct ObjectInstanceRen *obi, struct Isect *is);
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index ac42c0d1dcc..560627b1be1 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -1363,6 +1363,26 @@ void project_renderdata(Render *re,
/* ------------------------------------------------------------------------- */
+void RE_updateRenderInstance(Render *re, ObjectInstanceRen *obi, int flag)
+{
+ /* flag specifies what things have changed. */
+ if (flag & RE_OBJECT_INSTANCES_UPDATE_OBMAT) {
+ copy_m4_m4(obi->obmat, obi->ob->obmat);
+ invert_m4_m4(obi->obinvmat, obi->obmat);
+ }
+ if (flag & RE_OBJECT_INSTANCES_UPDATE_VIEW) {
+ mul_m4_m4m4(obi->localtoviewmat, re->viewmat, obi->obmat);
+ mul_m4_m4m4(obi->localtoviewinvmat, obi->obinvmat, re->viewinv);
+ }
+}
+
+void RE_updateRenderInstances(Render *re, int flag)
+{
+ int i = 0;
+ for (i = 0; i < re->totinstance; i++)
+ RE_updateRenderInstance(re, &re->objectinstance[i], flag);
+}
+
ObjectInstanceRen *RE_addRenderInstance(
Render *re, ObjectRen *obr, Object *ob, Object *par,
int index, int psysindex, float mat[4][4], int lay, const DupliObject *dob)
@@ -1407,6 +1427,8 @@ ObjectInstanceRen *RE_addRenderInstance(
}
}
+ RE_updateRenderInstance(re, obi, RE_OBJECT_INSTANCES_UPDATE_OBMAT | RE_OBJECT_INSTANCES_UPDATE_VIEW);
+
if (mat) {
copy_m4_m4(obi->mat, mat);
copy_m3_m4(mat3, mat);
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c
index 27c0f5d81ec..71b409dbba7 100644
--- a/source/blender/render/intern/source/shadeoutput.c
+++ b/source/blender/render/intern/source/shadeoutput.c
@@ -2112,3 +2112,31 @@ float RE_lamp_get_data(ShadeInput *shi, Object *lamp_obj, float col[4], float lv
return 0.0f;
}
+
+const float (*RE_object_instance_get_matrix(struct ObjectInstanceRen *obi, int matrix_id))[4]
+{
+ if (obi) {
+ switch (matrix_id) {
+ case RE_OBJECT_INSTANCE_MATRIX_OB:
+ return (const float(*)[4])obi->obmat;
+ case RE_OBJECT_INSTANCE_MATRIX_OBINV:
+ return (const float(*)[4])obi->obinvmat;
+ case RE_OBJECT_INSTANCE_MATRIX_LOCALTOVIEW:
+ return (const float(*)[4])obi->localtoviewmat;
+ case RE_OBJECT_INSTANCE_MATRIX_LOCALTOVIEWINV:
+ return (const float(*)[4])obi->localtoviewinvmat;
+ }
+ }
+ return NULL;
+}
+
+const float (*RE_render_current_get_matrix(int matrix_id))[4]
+{
+ switch(matrix_id) {
+ case RE_VIEW_MATRIX:
+ return (const float(*)[4])R.viewmat;
+ case RE_VIEWINV_MATRIX:
+ return (const float(*)[4])R.viewinv;
+ }
+ return NULL;
+}