Commit: 516e82a90012da3911518103829158215d94215f
Author: Brecht Van Lommel
Date:   Thu Mar 8 05:33:55 2018 +0100
Branches: master
https://developer.blender.org/rB516e82a90012da3911518103829158215d94215f

Code refactor: add ProjectionTransform separate from regular Transform.

This is in preparation of making Transform affine only.

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

M       intern/cycles/blender/blender_object_cull.cpp
M       intern/cycles/kernel/CMakeLists.txt
M       intern/cycles/kernel/geom/geom_primitive.h
M       intern/cycles/kernel/kernel_camera.h
M       intern/cycles/kernel/kernel_math.h
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/kernel/osl/osl_services.cpp
M       intern/cycles/render/camera.cpp
M       intern/cycles/render/camera.h
M       intern/cycles/util/CMakeLists.txt
A       intern/cycles/util/util_projection.h
M       intern/cycles/util/util_transform.h

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

diff --git a/intern/cycles/blender/blender_object_cull.cpp 
b/intern/cycles/blender/blender_object_cull.cpp
index 1d747de647a..bdf7dc469b2 100644
--- a/intern/cycles/blender/blender_object_cull.cpp
+++ b/intern/cycles/blender/blender_object_cull.cpp
@@ -96,7 +96,7 @@ bool BlenderObjectCulling::test(Scene *scene, BL::Object& 
b_ob, Transform& tfm)
 bool BlenderObjectCulling::test_camera(Scene *scene, float3 bb[8])
 {
        Camera *cam = scene->camera;
-       Transform& worldtondc = cam->worldtondc;
+       const ProjectionTransform& worldtondc = cam->worldtondc;
        float3 bb_min = make_float3(FLT_MAX, FLT_MAX, FLT_MAX),
               bb_max = make_float3(-FLT_MAX, -FLT_MAX, -FLT_MAX);
        bool all_behind = true;
diff --git a/intern/cycles/kernel/CMakeLists.txt 
b/intern/cycles/kernel/CMakeLists.txt
index 50ea03a1f8f..9b7f4e00084 100644
--- a/intern/cycles/kernel/CMakeLists.txt
+++ b/intern/cycles/kernel/CMakeLists.txt
@@ -254,6 +254,7 @@ set(SRC_UTIL_HEADERS
        ../util/util_math_int3.h
        ../util/util_math_int4.h
        ../util/util_math_matrix.h
+       ../util/util_projection.h
        ../util/util_rect.h
        ../util/util_static_assert.h
        ../util/util_transform.h
diff --git a/intern/cycles/kernel/geom/geom_primitive.h 
b/intern/cycles/kernel/geom/geom_primitive.h
index 60a1e483b84..6a8ea793ff0 100644
--- a/intern/cycles/kernel/geom/geom_primitive.h
+++ b/intern/cycles/kernel/geom/geom_primitive.h
@@ -204,14 +204,14 @@ ccl_device_inline float4 
primitive_motion_vector(KernelGlobals *kg, ShaderData *
        /* camera motion, for perspective/orthographic motion.pre/post will be a
         * world-to-raster matrix, for panorama it's world-to-camera */
        if(kernel_data.cam.type != CAMERA_PANORAMA) {
-               tfm = kernel_data.cam.worldtoraster;
-               motion_center = transform_perspective(&tfm, center);
+               ProjectionTransform projection = kernel_data.cam.worldtoraster;
+               motion_center = transform_perspective(&projection, center);
 
-               tfm = kernel_data.cam.motion.pre;
-               motion_pre = transform_perspective(&tfm, motion_pre);
+               projection = kernel_data.cam.perspective_motion.pre;
+               motion_pre = transform_perspective(&projection, motion_pre);
 
-               tfm = kernel_data.cam.motion.post;
-               motion_post = transform_perspective(&tfm, motion_post);
+               projection = kernel_data.cam.perspective_motion.post;
+               motion_post = transform_perspective(&projection, motion_post);
        }
        else {
                tfm = kernel_data.cam.worldtocamera;
diff --git a/intern/cycles/kernel/kernel_camera.h 
b/intern/cycles/kernel/kernel_camera.h
index 66ed9f5fc0f..5b102eabb93 100644
--- a/intern/cycles/kernel/kernel_camera.h
+++ b/intern/cycles/kernel/kernel_camera.h
@@ -42,7 +42,7 @@ ccl_device float2 camera_sample_aperture(ccl_constant 
KernelCamera *cam, float u
 ccl_device void camera_sample_perspective(KernelGlobals *kg, float raster_x, 
float raster_y, float lens_u, float lens_v, ccl_addr_space Ray *ray)
 {
        /* create ray form raster position */
-       Transform rastertocamera = kernel_data.cam.rastertocamera;
+       ProjectionTransform rastertocamera = kernel_data.cam.rastertocamera;
        float3 raster = make_float3(raster_x, raster_y, 0.0f);
        float3 Pcamera = transform_perspective(&rastertocamera, raster);
 
@@ -54,13 +54,13 @@ ccl_device void camera_sample_perspective(KernelGlobals 
*kg, float raster_x, flo
                 * interpolated field of view.
                 */
                if(ray->time < 0.5f) {
-                       Transform rastertocamera_pre = 
kernel_data.cam.perspective_motion.pre;
+                       ProjectionTransform rastertocamera_pre = 
kernel_data.cam.perspective_motion.pre;
                        float3 Pcamera_pre =
                                transform_perspective(&rastertocamera_pre, 
raster);
                        Pcamera = interp(Pcamera_pre, Pcamera, ray->time * 
2.0f);
                }
                else {
-                       Transform rastertocamera_post = 
kernel_data.cam.perspective_motion.post;
+                       ProjectionTransform rastertocamera_post = 
kernel_data.cam.perspective_motion.post;
                        float3 Pcamera_post =
                                transform_perspective(&rastertocamera_post, 
raster);
                        Pcamera = interp(Pcamera, Pcamera_post, (ray->time - 
0.5f) * 2.0f);
@@ -169,7 +169,7 @@ ccl_device void camera_sample_perspective(KernelGlobals 
*kg, float raster_x, flo
 ccl_device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, 
float raster_y, float lens_u, float lens_v, ccl_addr_space Ray *ray)
 {
        /* create ray form raster position */
-       Transform rastertocamera = kernel_data.cam.rastertocamera;
+       ProjectionTransform rastertocamera = kernel_data.cam.rastertocamera;
        float3 Pcamera = transform_perspective(&rastertocamera, 
make_float3(raster_x, raster_y, 0.0f));
 
        float3 P;
@@ -231,7 +231,7 @@ ccl_device_inline void camera_sample_panorama(ccl_constant 
KernelCamera *cam,
                                               float lens_u, float lens_v,
                                               ccl_addr_space Ray *ray)
 {
-       Transform rastertocamera = cam->rastertocamera;
+       ProjectionTransform rastertocamera = cam->rastertocamera;
        float3 Pcamera = transform_perspective(&rastertocamera, 
make_float3(raster_x, raster_y, 0.0f));
 
        /* create ray form raster position */
@@ -442,7 +442,7 @@ ccl_device_inline float3 camera_world_to_ndc(KernelGlobals 
*kg, ShaderData *sd,
                if(sd->object == PRIM_NONE && kernel_data.cam.type == 
CAMERA_PERSPECTIVE)
                        P += camera_position(kg);
 
-               Transform tfm = kernel_data.cam.worldtondc;
+               ProjectionTransform tfm = kernel_data.cam.worldtondc;
                return transform_perspective(&tfm, P);
        }
        else {
diff --git a/intern/cycles/kernel/kernel_math.h 
b/intern/cycles/kernel/kernel_math.h
index bd0e23b7705..96391db7649 100644
--- a/intern/cycles/kernel/kernel_math.h
+++ b/intern/cycles/kernel/kernel_math.h
@@ -21,6 +21,7 @@
 #include "util/util_math.h"
 #include "util/util_math_fast.h"
 #include "util/util_math_intersect.h"
+#include "util/util_projection.h"
 #include "util/util_texture.h"
 #include "util/util_transform.h"
 
diff --git a/intern/cycles/kernel/kernel_types.h 
b/intern/cycles/kernel/kernel_types.h
index 2cab63cdc6a..87faa0d0e53 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -1159,7 +1159,7 @@ typedef struct KernelCamera {
 
        /* matrices */
        Transform cameratoworld;
-       Transform rastertocamera;
+       ProjectionTransform rastertocamera;
 
        /* differentials */
        float4 dx;
@@ -1193,21 +1193,18 @@ typedef struct KernelCamera {
        int is_inside_volume;
 
        /* more matrices */
-       Transform screentoworld;
-       Transform rastertoworld;
-       /* work around cuda sm 2.0 crash, this seems to
-        * cross some limit in combination with motion 
-        * Transform ndctoworld; */
-       Transform worldtoscreen;
-       Transform worldtoraster;
-       Transform worldtondc;
+       ProjectionTransform screentoworld;
+       ProjectionTransform rastertoworld;
+       ProjectionTransform ndctoworld;
+       ProjectionTransform worldtoscreen;
+       ProjectionTransform worldtoraster;
+       ProjectionTransform worldtondc;
        Transform worldtocamera;
 
        MotionTransform motion;
 
-       /* Denotes changes in the projective matrix, namely in rastertocamera.
-        * Used for camera zoom motion blur,
-        */
+       /* Stores changes in the projeciton matrix. Use for camera zoom motion
+        * blur and motion pass output for perspective camera. */
        PerspectiveMotionTransform perspective_motion;
 
        int shutter_table_offset;
diff --git a/intern/cycles/kernel/osl/osl_services.cpp 
b/intern/cycles/kernel/osl/osl_services.cpp
index ae4c521659c..dec56c6665b 100644
--- a/intern/cycles/kernel/osl/osl_services.cpp
+++ b/intern/cycles/kernel/osl/osl_services.cpp
@@ -62,11 +62,18 @@ CCL_NAMESPACE_BEGIN
 
 /* RenderServices implementation */
 
-#define COPY_MATRIX44(m1, m2)  { \
-       CHECK_TYPE(m1, OSL::Matrix44*); \
-       CHECK_TYPE(m2, Transform*); \
-       memcpy(m1, m2, sizeof(*m2)); \
-} (void)0
+static void copy_matrix(OSL::Matrix44& m, const Transform& tfm)
+{
+       // TODO: remember when making affine
+       Transform t = transform_transpose(tfm);
+       memcpy(&m, &t, sizeof(m));
+}
+
+static void copy_matrix(OSL::Matrix44& m, const ProjectionTransform& tfm)
+{
+       ProjectionTransform t = projection_transpose(tfm);
+       memcpy(&m, &t, sizeof(m));
+}
 
 /* static ustrings */
 ustring OSLRenderServices::u_distance("distance");
@@ -167,14 +174,12 @@ bool OSLRenderServices::get_matrix(OSL::ShaderGlobals 
*sg, OSL::Matrix44 &result
 #else
                        Transform tfm = object_fetch_transform(kg, object, 
OBJECT_TRANSFORM);
 #endif
-                       tfm = transform_transpose(tfm);
-                       COPY_MATRIX44(&result, &tfm);
+                       copy_matrix(result, tfm);
 
                        return true;
                }
                else if(sd->type == PRIMITIVE_LAMP) {
-                       Transform tfm = transform_transpose(sd->ob_tfm);
-                       COPY_MATRIX44(&result, &tfm);
+                       copy_matrix(result, sd->ob_tfm);
 
                        return true;
                }
@@ -203,14 +208,12 @@ bool 
OSLRenderServices::get_inverse_matrix(OSL::ShaderGlobals *sg, OSL::Matrix44
 #else
                        Transform itfm = object_fetch_transform(kg, object, 
OBJECT_INVERSE_TRANSFORM);
 #endif
-                       itfm = transform_transpose(itfm);
-                       COPY_MATRIX44(&result, &itfm);
+                       copy_matrix(result, itfm);
 
                        return true;
                }
                else if(sd->type == PRIMITIVE_LAMP) {
-                       Transform tfm = transform_transpose(sd->ob_itfm);
-                       COPY_MATRIX44(&result, &tfm);
+                       copy_matrix(result, sd->ob_itfm);
 
                        return true;
                }
@@ -224,23 +227,19 @@ bool OSLRenderServices::get_matrix(OSL::ShaderGlobals 
*sg, OSL::Matrix44 &result
        KernelGlobals *kg = kernel_globals;
 
        if(from == u_ndc) {
-               Transform tfm = 
transform_transpose(transform_quick_inverse(kernel_data.cam.worldtondc));
-               COPY_MATRIX44(&result, &tfm);
+               copy_matrix(result, kernel_data.cam.ndctoworld);
                return true;
        }
        else if(from == u_raster) {
-               Transform tfm = 
transform_transpose(kernel_data.cam.rastertoworld);
-               COPY_MATRIX44(&result, &tfm);
+               copy_matrix(result, kernel_data.cam.rastertoworld);
                return true;
        }
        else if(from == u_screen) {
-               Transform tfm = 
transform_transpose(kernel_data.cam.screentoworld);
-               COPY_MATRIX44(&result, &tfm);
+               copy_matrix(result, kernel_data.cam.screentoworld);
                return true;
        }
        else if(from == u_camera) {
-               Transform tfm = 
transform_transpose(kernel_data.cam.cameratoworld);
-               COPY_MATRIX44(&result, &tfm);
+               copy_matrix(result, kernel_data.cam.cameratoworld);
                return true;
        }
        else if(from == u_world) {
@@ -256,23 +255,19 @@ bool 
OSLRenderServices::get_inverse_matrix(OSL::ShaderGlobals *sg, OSL::Matrix44
        KernelGlobals *kg = kernel_globals;

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to