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:
authorDalai Felinto <dfelinto@gmail.com>2014-05-08 00:26:24 +0400
committerDalai Felinto <dfelinto@gmail.com>2014-05-08 21:38:43 +0400
commit672cebf19a8b7fe8f9ac0f732fd6e8a0df239c7f (patch)
treee83cb1f1a1f5bf80dbf2a6fe46e549f873863022 /intern/cycles/render
parent31cb7e395e656e4a1590e1c9c4531e8a4b4f32ea (diff)
Cycles-Bake: displacement support (fix T40068)
Code with contribution from Brecht Van Lommel. Reviewers: brecht Differential Revision: https://developer.blender.org/D510
Diffstat (limited to 'intern/cycles/render')
-rw-r--r--intern/cycles/render/bake.cpp29
-rw-r--r--intern/cycles/render/bake.h7
2 files changed, 32 insertions, 4 deletions
diff --git a/intern/cycles/render/bake.cpp b/intern/cycles/render/bake.cpp
index 2e3022e2c02..aa317ab672f 100644
--- a/intern/cycles/render/bake.cpp
+++ b/intern/cycles/render/bake.cpp
@@ -26,6 +26,10 @@ m_num_pixels(num_pixels)
m_primitive.resize(num_pixels);
m_u.resize(num_pixels);
m_v.resize(num_pixels);
+ m_dudx.resize(num_pixels);
+ m_dudy.resize(num_pixels);
+ m_dvdx.resize(num_pixels);
+ m_dvdy.resize(num_pixels);
}
BakeData::~BakeData()
@@ -33,13 +37,21 @@ BakeData::~BakeData()
m_primitive.clear();
m_u.clear();
m_v.clear();
+ m_dudx.clear();
+ m_dudy.clear();
+ m_dvdx.clear();
+ m_dvdy.clear();
}
-void BakeData::set(int i, int prim, float uv[2])
+void BakeData::set(int i, int prim, float uv[2], float dudx, float dudy, float dvdx, float dvdy)
{
m_primitive[i] = (prim == -1 ? -1 : m_tri_offset + prim);
m_u[i] = uv[0];
m_v[i] = uv[1];
+ m_dudx[i] = dudx;
+ m_dudy[i] = dudy;
+ m_dvdx[i] = dvdx;
+ m_dvdy[i] = dvdy;
}
int BakeData::object()
@@ -67,6 +79,16 @@ uint4 BakeData::data(int i)
);
}
+uint4 BakeData::differentials(int i)
+{
+ return make_uint4(
+ __float_as_int(m_dudx[i]),
+ __float_as_int(m_dudy[i]),
+ __float_as_int(m_dvdx[i]),
+ __float_as_int(m_dvdy[i])
+ );
+}
+
BakeManager::BakeManager()
{
m_bake_data = NULL;
@@ -102,11 +124,12 @@ bool BakeManager::bake(Device *device, DeviceScene *dscene, Scene *scene, Progre
/* setup input for device task */
device_vector<uint4> d_input;
- uint4 *d_input_data = d_input.resize(limit);
+ uint4 *d_input_data = d_input.resize(limit * 2);
size_t d_input_size = 0;
for(size_t i = 0; i < limit; i++) {
d_input_data[d_input_size++] = bake_data->data(i);
+ d_input_data[d_input_size++] = bake_data->differentials(i);
}
if(d_input_size == 0)
@@ -114,7 +137,7 @@ bool BakeManager::bake(Device *device, DeviceScene *dscene, Scene *scene, Progre
/* run device task */
device_vector<float4> d_output;
- d_output.resize(d_input_size);
+ d_output.resize(limit);
/* needs to be up to data for attribute access */
device->const_copy_to("__data", &dscene->data, sizeof(dscene->data));
diff --git a/intern/cycles/render/bake.h b/intern/cycles/render/bake.h
index 830a9513065..ea403f7d39a 100644
--- a/intern/cycles/render/bake.h
+++ b/intern/cycles/render/bake.h
@@ -29,10 +29,11 @@ public:
BakeData(const int object, const int tri_offset, const int num_pixels);
~BakeData();
- void set(int i, int prim, float uv[2]);
+ void set(int i, int prim, float uv[2], float dudx, float dudy, float dvdx, float dvdy);
int object();
int size();
uint4 data(int i);
+ uint4 differentials(int i);
bool is_valid(int i);
private:
@@ -42,6 +43,10 @@ private:
vector<int>m_primitive;
vector<float>m_u;
vector<float>m_v;
+ vector<float>m_dudx;
+ vector<float>m_dudy;
+ vector<float>m_dvdx;
+ vector<float>m_dvdy;
};
class BakeManager {