[Bf-blender-cvs] [e3944886] openvdb: Start working on volume attributes.
Kévin Dietrich
noreply at git.blender.org
Sun Nov 13 21:44:08 CET 2016
Commit: e394488665392d9fc403b3a99a81e1ba70739c48
Author: Kévin Dietrich
Date: Fri Feb 19 08:19:03 2016 +0100
Branches: openvdb
https://developer.blender.org/rBe394488665392d9fc403b3a99a81e1ba70739c48
Start working on volume attributes.
===================================================================
M intern/cycles/blender/blender_sync.h
A intern/cycles/blender/blender_volume.cpp
M intern/cycles/render/scene.h
M intern/cycles/render/shader.cpp
===================================================================
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index 48ff48a..5f726e5 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -114,6 +114,7 @@ private:
BL::Object& b_ob,
bool motion,
int time_index = 0);
+ void sync_volume(BL::Object& b_ob);
Object *sync_object(BL::Object& b_parent,
int persistent_id[OBJECT_PERSISTENT_ID_SIZE],
BL::DupliObject& b_dupli_ob,
diff --git a/intern/cycles/blender/blender_volume.cpp b/intern/cycles/blender/blender_volume.cpp
new file mode 100644
index 0000000..0b5e905
--- /dev/null
+++ b/intern/cycles/blender/blender_volume.cpp
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2011-2016 Blender Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "blender_sync.h"
+
+#include "../render/volume.h"
+
+#include <openvdb/openvdb.h>
+
+class Volume {
+public:
+ vector<uint> used_shaders;
+ AttributeSet attributes;
+ string name;
+};
+
+static Attribute *get_openvdb_attribute(Volume *volume, const string& filename, const ustring& name)
+{
+ Attribute *attr = NULL;
+
+ openvdb::initialize();
+
+ openvdb::io::File file(filename);
+ file.open();
+
+ openvdb::GridBase::ConstPtr grid = file.readGrid(name.string());
+
+ openvdb::Name name = grid->getName();
+ openvdb::Name value_type = grid->valueType();
+
+ if(value_type == "float") {
+ attr = volume->attributes.add(name, TypeDesc::TypeFloat, ATTR_ELEMENT_VOXEL);
+ }
+ else if(value_type == "vec3s") {
+ if (grid->getMetadata< openvdb::TypedMetadata<bool> >("is_color")) {
+ attr = volume->attributes.add(name, TypeDesc::TypeColor, ATTR_ELEMENT_VOXEL);
+ }
+ else {
+ attr = volume->attributes.add(name, TypeDesc::TypeVector, ATTR_ELEMENT_VOXEL);
+ }
+ }
+
+ return attr;
+}
+
+static void create_mesh_volume_attribute(BL::Object& b_ob,
+ Volume *volume,
+ VolumeManager *volume_manager,
+ const ustring &name,
+ float frame)
+{
+ BL::SmokeDomainSettings b_domain = object_smoke_domain_find(b_ob);
+
+ if(!b_domain)
+ return;
+
+ char filename[1024];
+ SmokeDomainSettings_cache_filename_get(&b_domain.ptr, filename);
+
+ Attribute *attr = get_openvdb_attribute(volume, filename, name);
+ VoxelAttribute *volume_data = attr->data_voxel();
+
+ // TODO(kevin): add volume fields to the Volume*
+// volume_data->manager = volume_manager;
+ volume_data->slot = volume_manager->add_volume(filename, name, 0, 0);
+}
+
+static void create_volume_attributes(Scene *scene,
+ BL::Object& b_ob,
+ Volume *volume,
+ float frame)
+{
+ foreach(uint id, volume->used_shaders) {
+ Shader *shader = scene->shaders[id];
+
+ foreach(AttributeRequest attribute, shader->attributes.requests) {
+ if (attribute.name == "") {
+ continue;
+ }
+
+ create_volume_attribute(b_ob, volume, scene->volume_manager, attribute.name, frame);
+ }
+ }
+}
+
+void BlenderSync::sync_volume(BL::Object &b_ob)
+{
+ BL::Material material_override = render_layer.material_override;
+
+ /* find shader indices */
+ vector<uint> used_shaders;
+
+ BL::Object::material_slots_iterator slot;
+ for(b_ob.material_slots.begin(slot); slot != b_ob.material_slots.end(); ++slot) {
+ if(material_override) {
+ find_shader(material_override, used_shaders, scene->default_volume);
+ }
+ else {
+ BL::ID b_material(slot->material());
+ find_shader(b_material, used_shaders, scene->default_volume);
+ }
+ }
+
+ if(used_shaders.size() == 0) {
+ if(material_override)
+ find_shader(material_override, used_shaders, scene->default_volume);
+ else
+ used_shaders.push_back(scene->default_volume);
+ }
+
+ Volume *volume;
+ volume->used_shaders = used_shaders;
+ volume->name = ustring(b_ob_data.name().c_str());
+
+ create_volume_attributes(scene, b_ob, volume, b_scene.frame_current());
+}
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index a3ffe6e..d5f7a86 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -187,6 +187,7 @@ public:
int default_light;
int default_background;
int default_empty;
+ int default_volume;
/* device */
Device *device;
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index 09a6061..6ba1364 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -317,6 +317,7 @@ void ShaderManager::device_update_shaders_used(Scene *scene)
scene->shaders[scene->default_light]->used = true;
scene->shaders[scene->default_background]->used = true;
scene->shaders[scene->default_empty]->used = true;
+ scene->shaders[scene->default_volume]->used = true;
foreach(Mesh *mesh, scene->meshes)
foreach(uint shader, mesh->used_shaders)
@@ -489,6 +490,23 @@ void ShaderManager::add_default(Scene *scene)
scene->shaders.push_back(shader);
scene->default_empty = scene->shaders.size() - 1;
}
+
+ /* default empty */
+ {
+ graph = new ShaderGraph();
+
+ closure = graph->add(new ScatterVolumeNode());
+ closure->input("Density")->value = make_float3(0.8f, 0.8f, 0.8f);
+ out = graph->output();
+
+ graph->connect(closure->output("Volume"), out->input("Volume"));
+
+ shader = new Shader();
+ shader->name = "default_volume";
+ shader->graph = graph;
+ scene->shaders.push_back(shader);
+ scene->default_volume = scene->shaders.size() - 1;
+ }
}
void ShaderManager::get_requested_graph_features(ShaderGraph *graph,
More information about the Bf-blender-cvs
mailing list