Commit: b66efbecf4780c65833f72ac8de5d18b5bca7e15
Author: Brecht Van Lommel
Date:   Thu Mar 8 06:48:14 2018 +0100
Branches: master
https://developer.blender.org/rBb66efbecf4780c65833f72ac8de5d18b5bca7e15

Code refactor: make Transform always affine, dropping last row.

This save a little memory and copying in the kernel by storing only a 4x3
matrix instead of a 4x4 matrix. We already did this in a few places, and
those don't need to be special exceptions anymore now.

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

M       intern/cycles/app/cycles_xml.cpp
M       intern/cycles/blender/blender_camera.cpp
M       intern/cycles/blender/blender_util.h
M       intern/cycles/graph/node_type.cpp
M       intern/cycles/graph/node_xml.cpp
M       intern/cycles/kernel/bvh/bvh_nodes.h
M       intern/cycles/kernel/geom/geom_attribute.h
M       intern/cycles/kernel/geom/geom_curve_intersect.h
M       intern/cycles/kernel/geom/geom_object.h
M       intern/cycles/kernel/kernel_textures.h
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/kernel/osl/osl_services.cpp
M       intern/cycles/kernel/svm/svm_mapping.h
M       intern/cycles/kernel/svm/svm_tex_coord.h
M       intern/cycles/kernel/svm/svm_voxel.h
M       intern/cycles/render/light.cpp
M       intern/cycles/render/mesh.cpp
M       intern/cycles/render/nodes.cpp
M       intern/cycles/render/object.cpp
M       intern/cycles/render/object.h
M       intern/cycles/render/osl.cpp
M       intern/cycles/render/scene.h
M       intern/cycles/util/util_projection.h
M       intern/cycles/util/util_transform.cpp
M       intern/cycles/util/util_transform.h

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

diff --git a/intern/cycles/app/cycles_xml.cpp b/intern/cycles/app/cycles_xml.cpp
index 21ae07e23b8..a46955322e3 100644
--- a/intern/cycles/app/cycles_xml.cpp
+++ b/intern/cycles/app/cycles_xml.cpp
@@ -40,6 +40,7 @@
 
 #include "util/util_foreach.h"
 #include "util/util_path.h"
+#include "util/util_projection.h"
 #include "util/util_transform.h"
 #include "util/util_xml.h"
 
@@ -546,8 +547,10 @@ static void xml_read_transform(xml_node node, Transform& 
tfm)
 {
        if(node.attribute("matrix")) {
                vector<float> matrix;
-               if(xml_read_float_array(matrix, node, "matrix") && 
matrix.size() == 16)
-                       tfm = tfm * 
transform_transpose((*(Transform*)&matrix[0]));
+               if(xml_read_float_array(matrix, node, "matrix") && 
matrix.size() == 16) {
+                       ProjectionTransform projection = 
*(ProjectionTransform*)&matrix[0];
+                       tfm = tfm * 
projection_to_transform(projection_transpose(projection));
+               }
        }
 
        if(node.attribute("translate")) {
diff --git a/intern/cycles/blender/blender_camera.cpp 
b/intern/cycles/blender/blender_camera.cpp
index 62e950e3bef..e5f885c0012 100644
--- a/intern/cycles/blender/blender_camera.cpp
+++ b/intern/cycles/blender/blender_camera.cpp
@@ -246,8 +246,7 @@ static Transform blender_camera_matrix(const Transform& tfm,
                        result = tfm *
                                make_transform(1.0f, 0.0f, 0.0f, 0.0f,
                                               0.0f, 0.0f, 1.0f, 0.0f,
-                                              0.0f, 1.0f, 0.0f, 0.0f,
-                                              0.0f, 0.0f, 0.0f, 1.0f);
+                                              0.0f, 1.0f, 0.0f, 0.0f);
                }
                else {
                        /* Make it so environment camera needs to be pointed in 
the direction
@@ -257,8 +256,7 @@ static Transform blender_camera_matrix(const Transform& tfm,
                        result = tfm *
                                make_transform( 0.0f, -1.0f, 0.0f, 0.0f,
                                                0.0f,  0.0f, 1.0f, 0.0f,
-                                              -1.0f,  0.0f, 0.0f, 0.0f,
-                                               0.0f,  0.0f, 0.0f, 1.0f);
+                                              -1.0f,  0.0f, 0.0f, 0.0f);
                }
        }
        else {
diff --git a/intern/cycles/blender/blender_util.h 
b/intern/cycles/blender/blender_util.h
index 363e19f7a20..c4c45035b5a 100644
--- a/intern/cycles/blender/blender_util.h
+++ b/intern/cycles/blender/blender_util.h
@@ -247,14 +247,15 @@ static inline float 
*image_get_float_pixels_for_frame(BL::Image& image,
 
 static inline Transform get_transform(const BL::Array<float, 16>& array)
 {
-       Transform tfm;
+       ProjectionTransform projection;
 
-       /* we assume both types to be just 16 floats, and transpose because 
blender
-        * use column major matrix order while we use row major */
-       memcpy(&tfm, &array, sizeof(float)*16);
-       tfm = transform_transpose(tfm);
+       /* We assume both types to be just 16 floats, and transpose because 
blender
+        * use column major matrix order while we use row major. */
+       memcpy(&projection, &array, sizeof(float)*16);
+       projection = projection_transpose(projection);
 
-       return tfm;
+       /* Drop last row, matrix is assumed to be affine transform. */
+       return projection_to_transform(projection);
 }
 
 static inline float2 get_float2(const BL::Array<float, 2>& array)
diff --git a/intern/cycles/graph/node_type.cpp 
b/intern/cycles/graph/node_type.cpp
index a3a8fa5f382..37aae211e93 100644
--- a/intern/cycles/graph/node_type.cpp
+++ b/intern/cycles/graph/node_type.cpp
@@ -77,7 +77,7 @@ size_t SocketType::max_size()
 
 void *SocketType::zero_default_value()
 {
-       static Transform zero_transform = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 
0, 0}, {0, 0, 0, 0}};
+       static Transform zero_transform = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 
0, 0}};
        return &zero_transform;
 }
 
diff --git a/intern/cycles/graph/node_xml.cpp b/intern/cycles/graph/node_xml.cpp
index d26b3b2c2c8..f4599e22d40 100644
--- a/intern/cycles/graph/node_xml.cpp
+++ b/intern/cycles/graph/node_xml.cpp
@@ -196,7 +196,7 @@ void xml_read_node(XMLReader& reader, Node *node, xml_node 
xml_node)
                        case SocketType::TRANSFORM:
                        {
                                array<Transform> value;
-                               xml_read_float_array<16>(value, attr);
+                               xml_read_float_array<12>(value, attr);
                                if(value.size() == 1) {
                                        node->set(socket, value[0]);
                                }
@@ -205,7 +205,7 @@ void xml_read_node(XMLReader& reader, Node *node, xml_node 
xml_node)
                        case SocketType::TRANSFORM_ARRAY:
                        {
                                array<Transform> value;
-                               xml_read_float_array<16>(value, attr);
+                               xml_read_float_array<12>(value, attr);
                                node->set(socket, value);
                                break;
                        }
@@ -400,12 +400,10 @@ xml_node xml_write_node(Node *node, xml_node xml_root)
                        {
                                Transform tfm = node->get_transform(socket);
                                std::stringstream ss;
-                               for(int i = 0; i < 4; i++) {
-                                       ss << string_printf("%g %g %g %g", 
(double)tfm[i][0], (double)tfm[i][1], (double)tfm[i][2], (double)tfm[i][3]);
-                                       if(i != 3) {
-                                               ss << " ";
-                                       }
+                               for(int i = 0; i < 3; i++) {
+                                       ss << string_printf("%g %g %g %g ", 
(double)tfm[i][0], (double)tfm[i][1], (double)tfm[i][2], (double)tfm[i][3]);
                                }
+                               ss << string_printf("%g %g %g %g", 0.0, 0.0, 
0.0, 1.0);
                                attr = ss.str().c_str();
                                break;
                        }
@@ -416,11 +414,12 @@ xml_node xml_write_node(Node *node, xml_node xml_root)
                                for(size_t j = 0; j < value.size(); j++) {
                                        const Transform& tfm = value[j];
 
-                                       for(int i = 0; i < 4; i++) {
-                                               ss << string_printf("%g %g %g 
%g", (double)tfm[i][0], (double)tfm[i][1], (double)tfm[i][2], 
(double)tfm[i][3]);
-                                               if(j != value.size() - 1 || i 
!= 3) {
-                                                       ss << " ";
-                                               }
+                                       for(int i = 0; i < 3; i++) {
+                                               ss << string_printf("%g %g %g 
%g ", (double)tfm[i][0], (double)tfm[i][1], (double)tfm[i][2], 
(double)tfm[i][3]);
+                                       }
+                                       ss << string_printf("%g %g %g %g", 0.0, 
0.0, 0.0, 1.0);
+                                       if(j != value.size() - 1) {
+                                               ss << " ";
                                        }
                                }
                                attr = ss.str().c_str();
diff --git a/intern/cycles/kernel/bvh/bvh_nodes.h 
b/intern/cycles/kernel/bvh/bvh_nodes.h
index 6c33dad5426..060b3934a41 100644
--- a/intern/cycles/kernel/bvh/bvh_nodes.h
+++ b/intern/cycles/kernel/bvh/bvh_nodes.h
@@ -25,7 +25,6 @@ ccl_device_forceinline Transform 
bvh_unaligned_node_fetch_space(KernelGlobals *k
        space.x = kernel_tex_fetch(__bvh_nodes, child_addr+1);
        space.y = kernel_tex_fetch(__bvh_nodes, child_addr+2);
        space.z = kernel_tex_fetch(__bvh_nodes, child_addr+3);
-       space.w = make_float4(0.0f, 0.0f, 0.0f, 1.0f);
        return space;
 }
 
diff --git a/intern/cycles/kernel/geom/geom_attribute.h 
b/intern/cycles/kernel/geom/geom_attribute.h
index 6e2ee3b62d7..42c053704d5 100644
--- a/intern/cycles/kernel/geom/geom_attribute.h
+++ b/intern/cycles/kernel/geom/geom_attribute.h
@@ -103,7 +103,6 @@ ccl_device Transform 
primitive_attribute_matrix(KernelGlobals *kg, const ShaderD
        tfm.x = kernel_tex_fetch(__attributes_float3, desc.offset + 0);
        tfm.y = kernel_tex_fetch(__attributes_float3, desc.offset + 1);
        tfm.z = kernel_tex_fetch(__attributes_float3, desc.offset + 2);
-       tfm.w = kernel_tex_fetch(__attributes_float3, desc.offset + 3);
 
        return tfm;
 }
diff --git a/intern/cycles/kernel/geom/geom_curve_intersect.h 
b/intern/cycles/kernel/geom/geom_curve_intersect.h
index faf3e3cdf2b..46c3f408f0b 100644
--- a/intern/cycles/kernel/geom/geom_curve_intersect.h
+++ b/intern/cycles/kernel/geom/geom_curve_intersect.h
@@ -170,8 +170,7 @@ ccl_device_forceinline bool cardinal_curve_intersect(
                htfm = make_transform(
                        dir.z / d, 0, -dir.x /d, 0,
                        -dir.x * dir.y /d, d, -dir.y * dir.z /d, 0,
-                       dir.x, dir.y, dir.z, 0,
-                       0, 0, 0, 1);
+                       dir.x, dir.y, dir.z, 0);
 
                float4 v00 = kernel_tex_fetch(__curves, prim);
 
diff --git a/intern/cycles/kernel/geom/geom_object.h 
b/intern/cycles/kernel/geom/geom_object.h
index cd330308e07..62bc46dc21b 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -28,12 +28,12 @@ CCL_NAMESPACE_BEGIN
 
 enum ObjectTransform {
        OBJECT_TRANSFORM = 0,
-       OBJECT_INVERSE_TRANSFORM = 4,
+       OBJECT_INVERSE_TRANSFORM = 1,
 };
 
 enum ObjectVectorTransform {
        OBJECT_VECTOR_MOTION_PRE = 0,
-       OBJECT_VECTOR_MOTION_POST = 3
+       OBJECT_VECTOR_MOTION_POST = 1
 };
 
 /* Object to world space transformation */
@@ -51,8 +51,6 @@ ccl_device_inline Transform 
object_fetch_transform(KernelGlobals *kg, int object
                tfm.y = kernel_tex_fetch(__objects, object).tfm.pre.y;
                tfm.z = kernel_tex_fetch(__objects, object).tfm.pre.z;
        }
-       tfm.w = make_float4(0.0f, 0.0f, 0.0f, 1.0f);
-
        return tfm;
 }
 
@@ -60,20 +58,12 @@ ccl_device_inline Transform 
object_fetch_transform(KernelGlobals *kg, int object
 
 ccl_device_inline Transform lamp_fetch_transform(KernelGlobals *kg, int lamp, 
bool inverse)
 {
-       Transform tfm;
        if(inverse) {
-               tfm.x = kernel_tex_fetch(__lights, lamp).itfm[0];
-               tfm.y = kernel_tex_fetch(__lights, lamp).itfm[1];
-               tfm.z = kernel_tex_fetch(__lights, lamp).itfm[2];
+               return kernel_tex_fetch(__lights, lamp).itfm;
        }
        else {
-               tfm.x = kernel_tex_fetch(__lights, lamp).tfm[0];
-               tfm.y = kernel_tex_fetch(__lights, lamp).tfm[1];
-               tfm.z = kernel_tex_fetch(__lights, lamp).tfm[2];
+               return kernel_tex_fetch(__lights, lamp).tfm;
        }
-       tfm.w = make_float4(0.0f, 0.0f, 0.0f, 1.0f);
-
-       return tfm;
 }
 
 /* Object to world space transformation for motion vectors */
@@ -81,14 +71,7 @@ ccl_device_inline Transform 
lamp_fetch_transform(KernelGlobals *kg, int lamp, bo
 ccl_device_inline Transform object_fetch_vector_transform(KernelGlobals *kg, 
int object, enum ObjectVectorTransform type)
 {
        int offset = object*OBJECT_VECTOR_SIZE + (int)type;
-
-       Transform tfm;
-       tfm.x = kernel_tex_fetch(__objects_vector, offset + 0);
-       tfm.y = kernel_tex_fetch(__objects_vector, offset + 1);
-       tfm.z = kernel_tex_fetch(__objects_vector, offset + 2);
-       tfm.w = make_float4(0.0f, 0.0f, 0.0f, 1.0f);
-
-       return tfm;
+       return kernel_tex_fetch(__objects_vector, offset);
 }
 
 /* Motion blurred object transformations */
diff --git a/intern/cycles/kernel/kernel_textures.h 
b/intern/cycles/kernel/kernel_textures.h
index 892e0c84cba..6e07d88008e 100644
--- a/intern/cycles/kernel/kernel_textures.h
+++ b/intern/cycles/kernel/kernel_textures.h
@@ -32,7 +32,7 @@ KERNEL_TEX(float2, __prim_time)
 
 /* objects */
 KERNEL_TEX(KernelObject, __objects)
-KERNEL_TEX(float4, __objects_vector)
+KERNEL_TEX(Transform, __objects_vector)
 
 /* triangles */
 KERNEL_TEX(uint, __tri_shader)
diff --git a/intern/cycles/kernel/kernel_types.h 
b/intern/cycles/kernel/kernel_types.h
index 5934ff5

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