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:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-03-08 08:48:14 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-03-10 06:54:05 +0300
commitb66efbecf4780c65833f72ac8de5d18b5bca7e15 (patch)
tree58f258df9e797f55ad1a77082115989df147e6db /intern/cycles/render
parent623141f339d5066ed6b96ad70ab45fb294e3e612 (diff)
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.
Diffstat (limited to 'intern/cycles/render')
-rw-r--r--intern/cycles/render/light.cpp13
-rw-r--r--intern/cycles/render/mesh.cpp6
-rw-r--r--intern/cycles/render/nodes.cpp17
-rw-r--r--intern/cycles/render/object.cpp15
-rw-r--r--intern/cycles/render/object.h2
-rw-r--r--intern/cycles/render/osl.cpp15
-rw-r--r--intern/cycles/render/scene.h2
7 files changed, 32 insertions, 38 deletions
diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp
index a3f67361f6e..8dec7e4ea64 100644
--- a/intern/cycles/render/light.cpp
+++ b/intern/cycles/render/light.cpp
@@ -785,11 +785,8 @@ void LightManager::device_update_points(Device *,
klights[light_index].max_bounces = max_bounces;
klights[light_index].random = random;
-
- Transform tfm = light->tfm;
- Transform itfm = transform_inverse(tfm);
- memcpy(&klights[light_index].tfm, &tfm, sizeof(float4)*3);
- memcpy(&klights[light_index].itfm, &itfm, sizeof(float4)*3);
+ klights[light_index].tfm = light->tfm;
+ klights[light_index].itfm = transform_inverse(light->tfm);
light_index++;
}
@@ -825,10 +822,8 @@ void LightManager::device_update_points(Device *,
klights[light_index].area.dir[0] = dir.x;
klights[light_index].area.dir[1] = dir.y;
klights[light_index].area.dir[2] = dir.z;
- Transform tfm = light->tfm;
- Transform itfm = transform_inverse(tfm);
- memcpy(&klights[light_index].tfm, &tfm, sizeof(float4)*3);
- memcpy(&klights[light_index].itfm, &itfm, sizeof(float4)*3);
+ klights[light_index].tfm = light->tfm;
+ klights[light_index].itfm = transform_inverse(light->tfm);
light_index++;
}
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 47d24970949..71cbf5c24b6 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -1445,11 +1445,11 @@ static void update_attribute_element_offset(Mesh *mesh,
Transform *tfm = mattr->data_transform();
offset = attr_float3_offset;
- assert(attr_float3.size() >= offset + size * 4);
- for(size_t k = 0; k < size*4; k++) {
+ assert(attr_float3.size() >= offset + size * 3);
+ for(size_t k = 0; k < size*3; k++) {
attr_float3[offset+k] = (&tfm->x)[k];
}
- attr_float3_offset += size * 4;
+ attr_float3_offset += size * 3;
}
else {
float4 *data = mattr->data_float4();
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 41c9730e6fb..f117962a2ea 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -117,8 +117,7 @@ Transform TextureMapping::compute_transform()
case NORMAL:
/* no translation for normals, and inverse transpose */
mat = rmat*smat;
- mat = transform_inverse(mat);
- mat = transform_transpose(mat);
+ mat = transform_transposed_inverse(mat);
break;
}
@@ -153,7 +152,6 @@ void TextureMapping::compile(SVMCompiler& compiler, int offset_in, int offset_ou
compiler.add_node(tfm.x);
compiler.add_node(tfm.y);
compiler.add_node(tfm.z);
- compiler.add_node(tfm.w);
if(use_minmax) {
compiler.add_node(NODE_MIN_MAX, offset_out, offset_out);
@@ -193,9 +191,7 @@ void TextureMapping::compile_end(SVMCompiler& compiler, ShaderInput *vector_in,
void TextureMapping::compile(OSLCompiler &compiler)
{
if(!skip()) {
- Transform tfm = transform_transpose(compute_transform());
-
- compiler.parameter("mapping", tfm);
+ compiler.parameter("mapping", compute_transform());
compiler.parameter("use_mapping", 1);
}
}
@@ -1434,7 +1430,6 @@ void PointDensityTextureNode::compile(SVMCompiler& compiler)
compiler.add_node(tfm.x);
compiler.add_node(tfm.y);
compiler.add_node(tfm.z);
- compiler.add_node(tfm.w);
}
}
else {
@@ -1478,7 +1473,7 @@ void PointDensityTextureNode::compile(OSLCompiler& compiler)
compiler.parameter("filename", string_printf("@%d", slot).c_str());
}
if(space == NODE_TEX_VOXEL_SPACE_WORLD) {
- compiler.parameter("mapping", transform_transpose(tfm));
+ compiler.parameter("mapping", tfm);
compiler.parameter("use_mapping", 1);
}
compiler.parameter(this, "interpolation");
@@ -1558,8 +1553,7 @@ void MappingNode::compile(SVMCompiler& compiler)
void MappingNode::compile(OSLCompiler& compiler)
{
- Transform tfm = transform_transpose(tex_mapping.compute_transform());
- compiler.parameter("Matrix", tfm);
+ compiler.parameter("Matrix", tex_mapping.compute_transform());
compiler.parameter_point("mapping_min", tex_mapping.min);
compiler.parameter_point("mapping_max", tex_mapping.max);
compiler.parameter("use_minmax", tex_mapping.use_minmax);
@@ -3220,7 +3214,6 @@ void TextureCoordinateNode::compile(SVMCompiler& compiler)
compiler.add_node(ob_itfm.x);
compiler.add_node(ob_itfm.y);
compiler.add_node(ob_itfm.z);
- compiler.add_node(ob_itfm.w);
}
}
@@ -3259,7 +3252,7 @@ void TextureCoordinateNode::compile(OSLCompiler& compiler)
if(compiler.output_type() == SHADER_TYPE_VOLUME)
compiler.parameter("is_volume", true);
compiler.parameter(this, "use_transform");
- Transform ob_itfm = transform_transpose(transform_inverse(ob_tfm));
+ Transform ob_itfm = transform_transposed_inverse(ob_tfm);
compiler.parameter("object_itfm", ob_itfm);
compiler.parameter(this, "from_dupli");
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp
index f632f7c4a53..92c7e9cf1b8 100644
--- a/intern/cycles/render/object.cpp
+++ b/intern/cycles/render/object.cpp
@@ -132,7 +132,7 @@ void Object::apply_transform(bool apply_to_motion)
/* store matrix to transform later. when accessing these as attributes we
* do not want the transform to be applied for consistency between static
* and dynamic BVH, so we do it on packing. */
- mesh->transform_normal = transform_transpose(transform_inverse(tfm));
+ mesh->transform_normal = transform_transposed_inverse(tfm);
/* apply to mesh vertices */
for(size_t i = 0; i < mesh->verts.size(); i++)
@@ -290,7 +290,7 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s
int object_index)
{
KernelObject& kobject = state->objects[object_index];
- float4 *objects_vector = state->objects_vector;
+ Transform *objects_vector = state->objects_vector;
Mesh *mesh = ob->mesh;
uint flag = 0;
@@ -357,11 +357,8 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s
}
}
- /* OBJECT_TRANSFORM */
- memcpy(&kobject.tfm.pre, &tfm, sizeof(float4)*3);
- /* OBJECT_INVERSE_TRANSFORM */
- memcpy(&kobject.tfm.mid, &itfm, sizeof(float4)*3);
- /* OBJECT_PROPERTIES */
+ memcpy(&kobject.tfm.pre, &tfm, sizeof(tfm));
+ memcpy(&kobject.tfm.mid, &itfm, sizeof(itfm));
kobject.surface_area = surface_area;
kobject.pass_id = pass_id;
kobject.random_number = random_number;
@@ -395,8 +392,8 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s
mtfm.post = mtfm.post * itfm;
}
- memcpy(&objects_vector[object_index*OBJECT_VECTOR_SIZE+0], &mtfm.pre, sizeof(float4)*3);
- memcpy(&objects_vector[object_index*OBJECT_VECTOR_SIZE+3], &mtfm.post, sizeof(float4)*3);
+ objects_vector[object_index*OBJECT_VECTOR_SIZE+0] = mtfm.pre;
+ objects_vector[object_index*OBJECT_VECTOR_SIZE+1] = mtfm.post;
}
else if(state->need_motion == Scene::MOTION_BLUR) {
if(ob->use_motion) {
diff --git a/intern/cycles/render/object.h b/intern/cycles/render/object.h
index 54046d7069f..59c1d916595 100644
--- a/intern/cycles/render/object.h
+++ b/intern/cycles/render/object.h
@@ -135,7 +135,7 @@ protected:
/* Packed object arrays. Those will be filled in. */
uint *object_flag;
KernelObject *objects;
- float4 *objects_vector;
+ Transform *objects_vector;
/* Flags which will be synchronized to Integrator. */
bool have_motion;
diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp
index 9e931280691..f1a22350060 100644
--- a/intern/cycles/render/osl.cpp
+++ b/intern/cycles/render/osl.cpp
@@ -34,6 +34,7 @@
#include "util/util_md5.h"
#include "util/util_path.h"
#include "util/util_progress.h"
+#include "util/util_projection.h"
#endif
@@ -832,7 +833,9 @@ void OSLCompiler::parameter(ShaderNode* node, const char *name)
case SocketType::TRANSFORM:
{
Transform value = node->get_transform(socket);
- ss->Parameter(uname, TypeDesc::TypeMatrix, &value);
+ ProjectionTransform projection(value);
+ projection = projection_transpose(projection);
+ ss->Parameter(uname, TypeDesc::TypeMatrix, &projection);
break;
}
case SocketType::BOOLEAN_ARRAY:
@@ -900,7 +903,11 @@ void OSLCompiler::parameter(ShaderNode* node, const char *name)
case SocketType::TRANSFORM_ARRAY:
{
const array<Transform>& value = node->get_transform_array(socket);
- ss->Parameter(uname, array_typedesc(TypeDesc::TypeMatrix, value.size()), value.data());
+ array<ProjectionTransform> fvalue(value.size());
+ for(size_t i = 0; i < value.size(); i++) {
+ fvalue[i] = projection_transpose(ProjectionTransform(value[i]));
+ }
+ ss->Parameter(uname, array_typedesc(TypeDesc::TypeMatrix, fvalue.size()), fvalue.data());
break;
}
case SocketType::CLOSURE:
@@ -967,7 +974,9 @@ void OSLCompiler::parameter(const char *name, ustring s)
void OSLCompiler::parameter(const char *name, const Transform& tfm)
{
OSL::ShadingSystem *ss = (OSL::ShadingSystem*)shadingsys;
- ss->Parameter(name, TypeDesc::TypeMatrix, (float*)&tfm);
+ ProjectionTransform projection(tfm);
+ projection = projection_transpose(projection);
+ ss->Parameter(name, TypeDesc::TypeMatrix, (float*)&projection);
}
void OSLCompiler::parameter_array(const char *name, const float f[], int arraylen)
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index 316ffeb1092..cd5c9c1dadc 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -87,7 +87,7 @@ public:
/* objects */
device_vector<KernelObject> objects;
- device_vector<float4> objects_vector;
+ device_vector<Transform> objects_vector;
/* attributes */
device_vector<uint4> attributes_map;