From f66ff4ee86a9ead9ef6f3776b64f4dda32eab521 Mon Sep 17 00:00:00 2001 From: Stefan Werner Date: Wed, 7 Mar 2018 22:19:56 +0100 Subject: Code refactor: use KernelOject struct instead of float4 array. Original patch by Stefan with modifications by Brecht. --- intern/cycles/render/object.cpp | 46 +++++++++++++++++++++-------------------- intern/cycles/render/object.h | 2 +- intern/cycles/render/scene.h | 2 +- 3 files changed, 26 insertions(+), 24 deletions(-) (limited to 'intern/cycles/render') diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index b981d2b8849..c992469cb39 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -289,7 +289,7 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s Object *ob, int object_index) { - float4 *objects = state->objects; + KernelObject& kobject = state->objects[object_index]; float4 *objects_vector = state->objects_vector; Mesh *mesh = ob->mesh; @@ -357,15 +357,15 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s } } - /* Pack in texture. */ - int offset = object_index*OBJECT_SIZE; - /* OBJECT_TRANSFORM */ - memcpy(&objects[offset], &tfm, sizeof(float4)*3); + memcpy(&kobject.tfm.pre, &tfm, sizeof(float4)*3); /* OBJECT_INVERSE_TRANSFORM */ - memcpy(&objects[offset+4], &itfm, sizeof(float4)*3); + memcpy(&kobject.tfm.mid, &itfm, sizeof(float4)*3); /* OBJECT_PROPERTIES */ - objects[offset+12] = make_float4(surface_area, pass_id, random_number, __int_as_float(particle_index)); + kobject.surface_area = surface_area; + kobject.pass_id = pass_id; + kobject.random_number = random_number; + kobject.particle_index = particle_index; if(mesh->use_motion_blur) { state->have_motion = true; @@ -404,21 +404,24 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s MotionTransform decomp; transform_motion_decompose(&decomp, &ob->motion, &ob->tfm); - memcpy(&objects[offset], &decomp, sizeof(float4)*12); + kobject.tfm = decomp; flag |= SD_OBJECT_MOTION; state->have_motion = true; } } /* Dupli object coords and motion info. */ + kobject.dupli_generated[0] = ob->dupli_generated[0]; + kobject.dupli_generated[1] = ob->dupli_generated[1]; + kobject.dupli_generated[2] = ob->dupli_generated[2]; + kobject.numkeys = mesh->curve_keys.size(); + kobject.dupli_uv[0] = ob->dupli_uv[0]; + kobject.dupli_uv[1] = ob->dupli_uv[1]; int totalsteps = mesh->motion_steps; - int numsteps = (totalsteps - 1)/2; - int numverts = mesh->verts.size(); - int numkeys = mesh->curve_keys.size(); - - objects[offset+13] = make_float4(ob->dupli_generated[0], ob->dupli_generated[1], ob->dupli_generated[2], __int_as_float(numkeys)); - objects[offset+14] = make_float4(ob->dupli_uv[0], ob->dupli_uv[1], __int_as_float(numsteps), __int_as_float(numverts)); - objects[offset+15] = make_float4(0.0f, 0.0f, 0.0f, 0.0f); + kobject.numsteps = (totalsteps - 1)/2; + kobject.numverts = mesh->verts.size();; + kobject.patch_map_offset = 0; + kobject.attribute_map_offset = 0; /* Object flag. */ if(ob->use_holdout) { @@ -486,7 +489,7 @@ void ObjectManager::device_update_transforms(DeviceScene *dscene, state.queue_start_object = 0; state.object_flag = object_flag; - state.objects = dscene->objects.alloc(OBJECT_SIZE*scene->objects.size()); + state.objects = dscene->objects.alloc(scene->objects.size()); if(state.need_motion == Scene::MOTION_PASS) { state.objects_vector = dscene->objects_vector.alloc(OBJECT_VECTOR_SIZE*scene->objects.size()); } @@ -652,27 +655,26 @@ void ObjectManager::device_update_mesh_offsets(Device *, DeviceScene *dscene, Sc return; } - uint4* objects = (uint4*)dscene->objects.data(); + KernelObject *kobjects = dscene->objects.data(); bool update = false; int object_index = 0; foreach(Object *object, scene->objects) { Mesh* mesh = object->mesh; - int offset = object_index*OBJECT_SIZE + 15; if(mesh->patch_table) { uint patch_map_offset = 2*(mesh->patch_table_offset + mesh->patch_table->total_size() - mesh->patch_table->num_nodes * PATCH_NODE_SIZE) - mesh->patch_offset; - if(objects[offset].x != patch_map_offset) { - objects[offset].x = patch_map_offset; + if(kobjects[object_index].patch_map_offset != patch_map_offset) { + kobjects[object_index].patch_map_offset = patch_map_offset; update = true; } } - if(objects[offset].y != mesh->attr_map_offset) { - objects[offset].y = mesh->attr_map_offset; + if(kobjects[object_index].attribute_map_offset != mesh->attr_map_offset) { + kobjects[object_index].attribute_map_offset = mesh->attr_map_offset; update = true; } diff --git a/intern/cycles/render/object.h b/intern/cycles/render/object.h index acdb1b64123..54046d7069f 100644 --- a/intern/cycles/render/object.h +++ b/intern/cycles/render/object.h @@ -134,7 +134,7 @@ protected: /* Packed object arrays. Those will be filled in. */ uint *object_flag; - float4 *objects; + KernelObject *objects; float4 *objects_vector; /* Flags which will be synchronized to Integrator. */ diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h index ea9485ff230..48e9ae4117a 100644 --- a/intern/cycles/render/scene.h +++ b/intern/cycles/render/scene.h @@ -86,7 +86,7 @@ public: device_vector patches; /* objects */ - device_vector objects; + device_vector objects; device_vector objects_vector; /* attributes */ -- cgit v1.2.3