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:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2019-03-26 16:34:18 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-03-26 16:42:26 +0300
commita29446da526d601a03c9083d19e3c18d7b470f20 (patch)
tree0c2280e02f8153fb8c11b43471641a2e0d60c837 /intern/cycles/render
parentede1ca0b3f8484aa5458b2b540190de1bf68146f (diff)
Cycles: sync various master changes to blender2.7.
Many of these were left out accidentally. We will only do important bugfixes in blender2.7 for Cycles from this point on.
Diffstat (limited to 'intern/cycles/render')
-rw-r--r--intern/cycles/render/film.cpp11
-rw-r--r--intern/cycles/render/image.cpp33
-rw-r--r--intern/cycles/render/image.h4
-rw-r--r--intern/cycles/render/light.cpp13
-rw-r--r--intern/cycles/render/light.h1
-rw-r--r--intern/cycles/render/nodes.cpp33
-rw-r--r--intern/cycles/render/nodes.h2
-rw-r--r--intern/cycles/render/scene.cpp5
-rw-r--r--intern/cycles/render/scene.h3
-rw-r--r--intern/cycles/render/shader.cpp1
-rw-r--r--intern/cycles/render/shader.h1
11 files changed, 84 insertions, 23 deletions
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index b305fa59123..1d1668a20d1 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -329,8 +329,17 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
for(size_t i = 0; i < passes.size(); i++) {
Pass& pass = passes[i];
- if(pass.type == PASS_NONE)
+ if(pass.type == PASS_NONE) {
continue;
+ }
+
+ /* Can't do motion pass if no motion vectors are available. */
+ if (pass.type == PASS_MOTION || pass.type == PASS_MOTION_WEIGHT) {
+ if (scene->need_motion() != Scene::MOTION_PASS) {
+ kfilm->pass_stride += pass.components;
+ continue;
+ }
+ }
int pass_flag = (1 << (pass.type % 32));
if(pass.type <= PASS_CATEGORY_MAIN_END) {
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index 341a95c0258..1edd5865836 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -1020,6 +1020,39 @@ void ImageManager::device_update_slot(Device *device,
}
}
+void ImageManager::device_load_builtin(Device *device,
+ Scene *scene,
+ Progress& progress)
+{
+ /* Load only builtin images, Blender needs this to load evaluated
+ * scene data from depsgraph before it is freed. */
+ if(!need_update) {
+ return;
+ }
+
+ TaskPool pool;
+ for(int type = 0; type < IMAGE_DATA_NUM_TYPES; type++) {
+ for(size_t slot = 0; slot < images[type].size(); slot++) {
+ if(!images[type][slot])
+ continue;
+
+ if(images[type][slot]->need_load) {
+ if(images[type][slot]->builtin_data) {
+ pool.push(function_bind(&ImageManager::device_load_image,
+ this,
+ device,
+ scene,
+ (ImageDataType)type,
+ slot,
+ &progress));
+ }
+ }
+ }
+ }
+
+ pool.wait_work();
+}
+
void ImageManager::device_free_builtin(Device *device)
{
for(int type = 0; type < IMAGE_DATA_NUM_TYPES; type++) {
diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h
index cd7130b3898..1403b9050fd 100644
--- a/intern/cycles/render/image.h
+++ b/intern/cycles/render/image.h
@@ -96,6 +96,10 @@ public:
int flat_slot,
Progress *progress);
void device_free(Device *device);
+
+ void device_load_builtin(Device *device,
+ Scene *scene,
+ Progress& progress);
void device_free_builtin(Device *device);
void set_osl_texture_system(void *texture_system);
diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp
index 7439f82790d..56d60adf71d 100644
--- a/intern/cycles/render/light.cpp
+++ b/intern/cycles/render/light.cpp
@@ -118,6 +118,7 @@ NODE_DEFINE(Light)
SOCKET_FLOAT(sizeu, "Size U", 1.0f);
SOCKET_VECTOR(axisv, "Axis V", make_float3(0.0f, 0.0f, 0.0f));
SOCKET_FLOAT(sizev, "Size V", 1.0f);
+ SOCKET_BOOLEAN(round, "Round", false);
SOCKET_INT(map_resolution, "Map Resolution", 0);
@@ -756,12 +757,15 @@ void LightManager::device_update_points(Device *,
float3 axisu = light->axisu*(light->sizeu*light->size);
float3 axisv = light->axisv*(light->sizev*light->size);
float area = len(axisu)*len(axisv);
- float invarea = (area > 0.0f)? 1.0f/area: 1.0f;
+ if(light->round) {
+ area *= -M_PI_4_F;
+ }
+ float invarea = (area != 0.0f)? 1.0f/area: 1.0f;
float3 dir = light->dir;
dir = safe_normalize(dir);
- if(light->use_mis && area > 0.0f)
+ if(light->use_mis && area != 0.0f)
shader_id |= SHADER_USE_MIS;
klights[light_index].co[0] = co.x;
@@ -829,7 +833,10 @@ void LightManager::device_update_points(Device *,
float3 axisu = light->axisu*(light->sizeu*light->size);
float3 axisv = light->axisv*(light->sizev*light->size);
float area = len(axisu)*len(axisv);
- float invarea = (area > 0.0f)? 1.0f/area: 1.0f;
+ if(light->round) {
+ area *= -M_PI_4_F;
+ }
+ float invarea = (area != 0.0f)? 1.0f/area: 1.0f;
float3 dir = light->dir;
dir = safe_normalize(dir);
diff --git a/intern/cycles/render/light.h b/intern/cycles/render/light.h
index e7c06604fc4..a627ec9bdc3 100644
--- a/intern/cycles/render/light.h
+++ b/intern/cycles/render/light.h
@@ -51,6 +51,7 @@ public:
float sizeu;
float3 axisv;
float sizev;
+ bool round;
Transform tfm;
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 6ba98391a61..cc9dd8f2679 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -1520,6 +1520,19 @@ void PointDensityTextureNode::attributes(Shader *shader,
ShaderNode::attributes(shader, attributes);
}
+void PointDensityTextureNode::add_image()
+{
+ if(slot == -1) {
+ ImageMetaData metadata;
+ slot = image_manager->add_image(filename.string(), builtin_data,
+ false, 0,
+ interpolation,
+ EXTENSION_CLIP,
+ true,
+ metadata);
+ }
+}
+
void PointDensityTextureNode::compile(SVMCompiler& compiler)
{
ShaderInput *vector_in = input("Vector");
@@ -1532,15 +1545,7 @@ void PointDensityTextureNode::compile(SVMCompiler& compiler)
image_manager = compiler.image_manager;
if(use_density || use_color) {
- if(slot == -1) {
- ImageMetaData metadata;
- slot = image_manager->add_image(filename.string(), builtin_data,
- false, 0,
- interpolation,
- EXTENSION_CLIP,
- true,
- metadata);
- }
+ add_image();
if(slot != -1) {
compiler.stack_assign(vector_in);
@@ -1583,15 +1588,7 @@ void PointDensityTextureNode::compile(OSLCompiler& compiler)
image_manager = compiler.image_manager;
if(use_density || use_color) {
- if(slot == -1) {
- ImageMetaData metadata;
- slot = image_manager->add_image(filename.string(), builtin_data,
- false, 0,
- interpolation,
- EXTENSION_CLIP,
- true,
- metadata);
- }
+ add_image();
if(slot != -1) {
compiler.parameter("filename", string_printf("@i%d", slot).c_str());
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index 5c27929719a..5571c525e9a 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -268,6 +268,8 @@ public:
bool has_spatial_varying() { return true; }
bool has_object_dependency() { return true; }
+ void add_image();
+
ustring filename;
NodeTexVoxelSpace space;
InterpolationType interpolation;
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index 59c4f5fccb8..1f551f206ef 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -84,7 +84,10 @@ DeviceScene::DeviceScene(Device *device)
}
Scene::Scene(const SceneParams& params_, Device *device)
-: device(device), dscene(device), params(params_)
+ : name("Scene"),
+ device(device),
+ dscene(device),
+ params(params_)
{
memset((void *)&dscene.data, 0, sizeof(dscene.data));
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index 22b2a61743d..e43800fe5c4 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -197,6 +197,9 @@ public:
class Scene {
public:
+ /* Optional name. Is used for logging and reporting. */
+ string name;
+
/* data */
Camera *camera;
Camera *dicing_camera;
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index 0f40ab7b15f..3c94f2dfb59 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -208,6 +208,7 @@ Shader::Shader()
need_update = true;
need_update_mesh = true;
+ need_sync_object = false;
}
Shader::~Shader()
diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h
index 4c7b2fd433b..05772b9a9cd 100644
--- a/intern/cycles/render/shader.h
+++ b/intern/cycles/render/shader.h
@@ -99,6 +99,7 @@ public:
/* synchronization */
bool need_update;
bool need_update_mesh;
+ bool need_sync_object;
/* If the shader has only volume components, the surface is assumed to
* be transparent.