[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