diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-12-01 23:15:05 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-12-01 23:15:05 +0400 |
commit | 7c0a0bae79bb8f842a575fe83975c6d34d73c64a (patch) | |
tree | 844857e85903601f60a083d767d6317f3006d31f /intern/cycles/render | |
parent | 807fd448a557fbacb70fcd9b5cae76529fdb9b80 (diff) |
Fix #33375: OSL geom:trianglevertices gave wrong coordinates for static BVH.
Also some simple OSL optimization, passing thread data pointer directly instead
of via thread local storage, and creating ustrings for attribute lookup.
Diffstat (limited to 'intern/cycles/render')
-rw-r--r-- | intern/cycles/render/object.cpp | 21 | ||||
-rw-r--r-- | intern/cycles/render/object.h | 4 | ||||
-rw-r--r-- | intern/cycles/render/osl.cpp | 14 | ||||
-rw-r--r-- | intern/cycles/render/osl.h | 2 |
4 files changed, 17 insertions, 24 deletions
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index d08cb07fc3c..bd9f16d64ef 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -148,10 +148,9 @@ ObjectManager::~ObjectManager() { } -void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) +void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene, Scene *scene, uint *object_flag, Progress& progress) { float4 *objects = dscene->objects.resize(OBJECT_SIZE*scene->objects.size()); - uint *object_flag = dscene->object_flag.resize(scene->objects.size()); int i = 0; map<Mesh*, float> surface_area_map; Scene::MotionType need_motion = scene->need_motion(device->info.advanced_shading); @@ -257,7 +256,6 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene } device->tex_alloc("__objects", dscene->objects); - device->tex_alloc("__object_flag", dscene->object_flag); dscene->data.bvh.have_motion = have_motion; } @@ -272,9 +270,12 @@ void ObjectManager::device_update(Device *device, DeviceScene *dscene, Scene *sc if(scene->objects.size() == 0) return; + /* object info flag */ + uint *object_flag = dscene->object_flag.resize(scene->objects.size()); + /* set object transform matrices, before applying static transforms */ progress.set_status("Updating Objects", "Copying Transformations to device"); - device_update_transforms(device, dscene, scene, progress); + device_update_transforms(device, dscene, scene, object_flag, progress); if(progress.get_cancel()) return; @@ -282,10 +283,11 @@ void ObjectManager::device_update(Device *device, DeviceScene *dscene, Scene *sc /* todo: do before to support getting object level coords? */ if(scene->params.bvh_type == SceneParams::BVH_STATIC) { progress.set_status("Updating Objects", "Applying Static Transformations"); - apply_static_transforms(scene, progress); + apply_static_transforms(scene, object_flag, progress); } - if(progress.get_cancel()) return; + /* allocate object flag */ + device->tex_alloc("__object_flag", dscene->object_flag); need_update = false; } @@ -299,7 +301,7 @@ void ObjectManager::device_free(Device *device, DeviceScene *dscene) dscene->object_flag.clear(); } -void ObjectManager::apply_static_transforms(Scene *scene, Progress& progress) +void ObjectManager::apply_static_transforms(Scene *scene, uint *object_flag, Progress& progress) { /* todo: normals and displacement should be done before applying transform! */ /* todo: create objects/meshes in right order! */ @@ -312,6 +314,7 @@ void ObjectManager::apply_static_transforms(Scene *scene, Progress& progress) #else bool motion_blur = false; #endif + int i = 0; foreach(Object *object, scene->objects) { map<Mesh*, int>::iterator it = mesh_users.find(object->mesh); @@ -334,8 +337,12 @@ void ObjectManager::apply_static_transforms(Scene *scene, Progress& progress) if(progress.get_cancel()) return; } + + object_flag[i] |= SD_TRANSFORM_APPLIED; } } + + i++; } } diff --git a/intern/cycles/render/object.h b/intern/cycles/render/object.h index 922c886d961..9c9b11bc29c 100644 --- a/intern/cycles/render/object.h +++ b/intern/cycles/render/object.h @@ -73,12 +73,12 @@ public: ~ObjectManager(); void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress); - void device_update_transforms(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress); + void device_update_transforms(Device *device, DeviceScene *dscene, Scene *scene, uint *object_flag, Progress& progress); void device_free(Device *device, DeviceScene *dscene); void tag_update(Scene *scene); - void apply_static_transforms(Scene *scene, Progress& progress); + void apply_static_transforms(Scene *scene, uint *object_flag, Progress& progress); }; CCL_NAMESPACE_END diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp index 2ec7e3d3775..e4ee40d881e 100644 --- a/intern/cycles/render/osl.cpp +++ b/intern/cycles/render/osl.cpp @@ -45,8 +45,6 @@ CCL_NAMESPACE_BEGIN OSLShaderManager::OSLShaderManager() { - thread_data_initialized = false; - services = new OSLRenderServices(); shading_system_init(); @@ -103,11 +101,6 @@ void OSLShaderManager::device_update(Device *device, DeviceScene *dscene, Scene scene->image_manager->set_osl_texture_system((void*)ts); device_update_common(device, dscene, scene, progress); - - if(!thread_data_initialized) { - og->thread_data_init(); - thread_data_initialized = true; - } } void OSLShaderManager::device_free(Device *device, DeviceScene *dscene) @@ -125,11 +118,6 @@ void OSLShaderManager::device_free(Device *device, DeviceScene *dscene) og->volume_state.clear(); og->displacement_state.clear(); og->background_state.reset(); - - if(thread_data_initialized) { - og->thread_data_free(); - thread_data_initialized = false; - } } void OSLShaderManager::texture_system_init() @@ -170,7 +158,7 @@ void OSLShaderManager::shading_system_init() const int nraytypes = sizeof(raytypes)/sizeof(raytypes[0]); ss->attribute("raytypes", TypeDesc(TypeDesc::STRING, nraytypes), raytypes); - OSLShader::register_closures(ss); + OSLShader::register_closures((OSLShadingSystem*)ss); loaded_shaders.clear(); } diff --git a/intern/cycles/render/osl.h b/intern/cycles/render/osl.h index 17934765155..08b5f8b89fb 100644 --- a/intern/cycles/render/osl.h +++ b/intern/cycles/render/osl.h @@ -73,8 +73,6 @@ protected: OSLRenderServices *services; OSL::ErrorHandler errhandler; set<string> loaded_shaders; - - bool thread_data_initialized; }; #endif |