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:
Diffstat (limited to 'intern/cycles/blender/blender_volume.cpp')
-rw-r--r--intern/cycles/blender/blender_volume.cpp322
1 files changed, 0 insertions, 322 deletions
diff --git a/intern/cycles/blender/blender_volume.cpp b/intern/cycles/blender/blender_volume.cpp
deleted file mode 100644
index 0a5b19d7d4c..00000000000
--- a/intern/cycles/blender/blender_volume.cpp
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright 2011-2013 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 "render/colorspace.h"
-#include "render/image.h"
-#include "render/image_vdb.h"
-#include "render/object.h"
-#include "render/volume.h"
-
-#include "blender/blender_sync.h"
-#include "blender/blender_util.h"
-
-#ifdef WITH_OPENVDB
-# include <openvdb/openvdb.h>
-openvdb::GridBase::ConstPtr BKE_volume_grid_openvdb_for_read(const struct Volume *volume,
- const struct VolumeGrid *grid);
-#endif
-
-CCL_NAMESPACE_BEGIN
-
-/* TODO: verify this is not loading unnecessary attributes. */
-class BlenderSmokeLoader : public ImageLoader {
- public:
- BlenderSmokeLoader(BL::Object &b_ob, AttributeStandard attribute)
- : b_domain(object_fluid_gas_domain_find(b_ob)), attribute(attribute)
- {
- BL::Mesh b_mesh(b_ob.data());
- mesh_texture_space(b_mesh, texspace_loc, texspace_size);
- }
-
- bool load_metadata(const ImageDeviceFeatures &, ImageMetaData &metadata) override
- {
- if (!b_domain) {
- return false;
- }
-
- if (attribute == ATTR_STD_VOLUME_DENSITY || attribute == ATTR_STD_VOLUME_FLAME ||
- attribute == ATTR_STD_VOLUME_HEAT || attribute == ATTR_STD_VOLUME_TEMPERATURE) {
- metadata.type = IMAGE_DATA_TYPE_FLOAT;
- metadata.channels = 1;
- }
- else if (attribute == ATTR_STD_VOLUME_COLOR) {
- metadata.type = IMAGE_DATA_TYPE_FLOAT4;
- metadata.channels = 4;
- }
- else if (attribute == ATTR_STD_VOLUME_VELOCITY) {
- metadata.type = IMAGE_DATA_TYPE_FLOAT4;
- metadata.channels = 3;
- }
- else {
- return false;
- }
-
- int3 resolution = get_int3(b_domain.domain_resolution());
- int amplify = (b_domain.use_noise()) ? b_domain.noise_scale() : 1;
-
- /* Velocity and heat data is always low-resolution. */
- if (attribute == ATTR_STD_VOLUME_VELOCITY || attribute == ATTR_STD_VOLUME_HEAT) {
- amplify = 1;
- }
-
- metadata.width = resolution.x * amplify;
- metadata.height = resolution.y * amplify;
- metadata.depth = resolution.z * amplify;
-
- /* Create a matrix to transform from object space to mesh texture space.
- * This does not work with deformations but that can probably only be done
- * well with a volume grid mapping of coordinates. */
- metadata.transform_3d = transform_translate(-texspace_loc) * transform_scale(texspace_size);
- metadata.use_transform_3d = true;
-
- return true;
- }
-
- bool load_pixels(const ImageMetaData &, void *pixels, const size_t, const bool) override
- {
- if (!b_domain) {
- return false;
- }
-#ifdef WITH_FLUID
- int3 resolution = get_int3(b_domain.domain_resolution());
- int length, amplify = (b_domain.use_noise()) ? b_domain.noise_scale() : 1;
-
- /* Velocity and heat data is always low-resolution. */
- if (attribute == ATTR_STD_VOLUME_VELOCITY || attribute == ATTR_STD_VOLUME_HEAT) {
- amplify = 1;
- }
-
- const int width = resolution.x * amplify;
- const int height = resolution.y * amplify;
- const int depth = resolution.z * amplify;
- const size_t num_pixels = ((size_t)width) * height * depth;
-
- float *fpixels = (float *)pixels;
-
- if (attribute == ATTR_STD_VOLUME_DENSITY) {
- FluidDomainSettings_density_grid_get_length(&b_domain.ptr, &length);
- if (length == num_pixels) {
- FluidDomainSettings_density_grid_get(&b_domain.ptr, fpixels);
- return true;
- }
- }
- else if (attribute == ATTR_STD_VOLUME_FLAME) {
- /* this is in range 0..1, and interpreted by the OpenGL smoke viewer
- * as 1500..3000 K with the first part faded to zero density */
- FluidDomainSettings_flame_grid_get_length(&b_domain.ptr, &length);
- if (length == num_pixels) {
- FluidDomainSettings_flame_grid_get(&b_domain.ptr, fpixels);
- return true;
- }
- }
- else if (attribute == ATTR_STD_VOLUME_COLOR) {
- /* the RGB is "premultiplied" by density for better interpolation results */
- FluidDomainSettings_color_grid_get_length(&b_domain.ptr, &length);
- if (length == num_pixels * 4) {
- FluidDomainSettings_color_grid_get(&b_domain.ptr, fpixels);
- return true;
- }
- }
- else if (attribute == ATTR_STD_VOLUME_VELOCITY) {
- FluidDomainSettings_velocity_grid_get_length(&b_domain.ptr, &length);
- if (length == num_pixels * 3) {
- FluidDomainSettings_velocity_grid_get(&b_domain.ptr, fpixels);
- return true;
- }
- }
- else if (attribute == ATTR_STD_VOLUME_HEAT) {
- FluidDomainSettings_heat_grid_get_length(&b_domain.ptr, &length);
- if (length == num_pixels) {
- FluidDomainSettings_heat_grid_get(&b_domain.ptr, fpixels);
- return true;
- }
- }
- else if (attribute == ATTR_STD_VOLUME_TEMPERATURE) {
- FluidDomainSettings_temperature_grid_get_length(&b_domain.ptr, &length);
- if (length == num_pixels) {
- FluidDomainSettings_temperature_grid_get(&b_domain.ptr, fpixels);
- return true;
- }
- }
- else {
- fprintf(stderr,
- "Cycles error: unknown volume attribute %s, skipping\n",
- Attribute::standard_name(attribute));
- fpixels[0] = 0.0f;
- return false;
- }
-#else
- (void)pixels;
-#endif
- fprintf(stderr, "Cycles error: unexpected smoke volume resolution, skipping\n");
- return false;
- }
-
- string name() const override
- {
- return Attribute::standard_name(attribute);
- }
-
- bool equals(const ImageLoader &other) const override
- {
- const BlenderSmokeLoader &other_loader = (const BlenderSmokeLoader &)other;
- return b_domain == other_loader.b_domain && attribute == other_loader.attribute;
- }
-
- BL::FluidDomainSettings b_domain;
- float3 texspace_loc, texspace_size;
- AttributeStandard attribute;
-};
-
-static void sync_smoke_volume(Scene *scene, BObjectInfo &b_ob_info, Volume *volume, float frame)
-{
- if (!b_ob_info.is_real_object_data()) {
- return;
- }
- BL::FluidDomainSettings b_domain = object_fluid_gas_domain_find(b_ob_info.real_object);
- if (!b_domain) {
- return;
- }
-
- AttributeStandard attributes[] = {ATTR_STD_VOLUME_DENSITY,
- ATTR_STD_VOLUME_COLOR,
- ATTR_STD_VOLUME_FLAME,
- ATTR_STD_VOLUME_HEAT,
- ATTR_STD_VOLUME_TEMPERATURE,
- ATTR_STD_VOLUME_VELOCITY,
- ATTR_STD_NONE};
-
- for (int i = 0; attributes[i] != ATTR_STD_NONE; i++) {
- AttributeStandard std = attributes[i];
- if (!volume->need_attribute(scene, std)) {
- continue;
- }
-
- volume->set_clipping(b_domain.clipping());
-
- Attribute *attr = volume->attributes.add(std);
-
- ImageLoader *loader = new BlenderSmokeLoader(b_ob_info.real_object, std);
- ImageParams params;
- params.frame = frame;
-
- attr->data_voxel() = scene->image_manager->add_image(loader, params);
- }
-}
-
-class BlenderVolumeLoader : public VDBImageLoader {
- public:
- BlenderVolumeLoader(BL::BlendData &b_data, BL::Volume &b_volume, const string &grid_name)
- : VDBImageLoader(grid_name), b_volume(b_volume)
- {
- b_volume.grids.load(b_data.ptr.data);
-
-#ifdef WITH_OPENVDB
- for (BL::VolumeGrid &b_volume_grid : b_volume.grids) {
- if (b_volume_grid.name() == grid_name) {
- const bool unload = !b_volume_grid.is_loaded();
-
- ::Volume *volume = (::Volume *)b_volume.ptr.data;
- const VolumeGrid *volume_grid = (VolumeGrid *)b_volume_grid.ptr.data;
- grid = BKE_volume_grid_openvdb_for_read(volume, volume_grid);
-
- if (unload) {
- b_volume_grid.unload();
- }
-
- break;
- }
- }
-#endif
- }
-
- BL::Volume b_volume;
-};
-
-static void sync_volume_object(BL::BlendData &b_data,
- BObjectInfo &b_ob_info,
- Scene *scene,
- Volume *volume)
-{
- BL::Volume b_volume(b_ob_info.object_data);
- b_volume.grids.load(b_data.ptr.data);
-
- BL::VolumeRender b_render(b_volume.render());
-
- volume->set_clipping(b_render.clipping());
- volume->set_step_size(b_render.step_size());
- volume->set_object_space((b_render.space() == BL::VolumeRender::space_OBJECT));
-
- /* Find grid with matching name. */
- for (BL::VolumeGrid &b_grid : b_volume.grids) {
- ustring name = ustring(b_grid.name());
- AttributeStandard std = ATTR_STD_NONE;
-
- if (name == Attribute::standard_name(ATTR_STD_VOLUME_DENSITY)) {
- std = ATTR_STD_VOLUME_DENSITY;
- }
- else if (name == Attribute::standard_name(ATTR_STD_VOLUME_COLOR)) {
- std = ATTR_STD_VOLUME_COLOR;
- }
- else if (name == Attribute::standard_name(ATTR_STD_VOLUME_FLAME)) {
- std = ATTR_STD_VOLUME_FLAME;
- }
- else if (name == Attribute::standard_name(ATTR_STD_VOLUME_HEAT)) {
- std = ATTR_STD_VOLUME_HEAT;
- }
- else if (name == Attribute::standard_name(ATTR_STD_VOLUME_TEMPERATURE)) {
- std = ATTR_STD_VOLUME_TEMPERATURE;
- }
- else if (name == Attribute::standard_name(ATTR_STD_VOLUME_VELOCITY)) {
- std = ATTR_STD_VOLUME_VELOCITY;
- }
-
- if ((std != ATTR_STD_NONE && volume->need_attribute(scene, std)) ||
- volume->need_attribute(scene, name)) {
- Attribute *attr = (std != ATTR_STD_NONE) ?
- volume->attributes.add(std) :
- volume->attributes.add(name, TypeDesc::TypeFloat, ATTR_ELEMENT_VOXEL);
-
- ImageLoader *loader = new BlenderVolumeLoader(b_data, b_volume, name.string());
- ImageParams params;
- params.frame = b_volume.grids.frame();
-
- attr->data_voxel() = scene->image_manager->add_image(loader, params, false);
- }
- }
-}
-
-void BlenderSync::sync_volume(BObjectInfo &b_ob_info, Volume *volume)
-{
- volume->clear(true);
-
- if (view_layer.use_volumes) {
- if (b_ob_info.object_data.is_a(&RNA_Volume)) {
- /* Volume object. Create only attributes, bounding mesh will then
- * be automatically generated later. */
- sync_volume_object(b_data, b_ob_info, scene, volume);
- }
- else {
- /* Smoke domain. */
- sync_smoke_volume(scene, b_ob_info, volume, b_scene.frame_current());
- }
- }
-
- /* Tag update. */
- volume->tag_update(scene, true);
-}
-
-CCL_NAMESPACE_END