[Bf-blender-cvs] [8268bb3] cycles-ptex-12: WIP ptex node in cycles
Nicholas Bishop
noreply at git.blender.org
Mon Jan 26 02:05:19 CET 2015
Commit: 8268bb310df841cace3ae0fbecb0f0f7754b57a3
Author: Nicholas Bishop
Date: Sun Jan 25 22:48:59 2015 +0100
Branches: cycles-ptex-12
https://developer.blender.org/rB8268bb310df841cace3ae0fbecb0f0f7754b57a3
WIP ptex node in cycles
===================================================================
M intern/cycles/blender/blender_mesh.cpp
M intern/cycles/blender/blender_session.cpp
M intern/cycles/blender/blender_session.h
M intern/cycles/blender/blender_shader.cpp
M intern/cycles/kernel/kernel_types.h
M intern/cycles/kernel/svm/svm.h
M intern/cycles/kernel/svm/svm_image.h
M intern/cycles/kernel/svm/svm_types.h
M intern/cycles/render/attribute.cpp
M intern/cycles/render/attribute.h
M intern/cycles/render/image.cpp
M intern/cycles/render/image.h
M intern/cycles/render/mesh.cpp
M intern/cycles/render/mesh.h
M intern/cycles/render/nodes.cpp
M intern/cycles/render/nodes.h
===================================================================
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 295dade..c3a9b48 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -388,6 +388,31 @@ static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<
}
}
+ // TODO
+#if 1
+ if (mesh->need_attribute(scene, ATTR_STD_PTEX_LAYER, ustring("TODO"))) {
+ Attribute *attr = mesh->attributes.add(ATTR_STD_PTEX_LAYER);
+ mesh->attributes.reserve();
+
+ BL::Mesh::loop_ptex_iterator l;
+
+ float *slot = attr->data_float();
+ bool is_float;
+ bool is_linear;
+ // Get layer, get RNA image pointer
+ // TODO
+ for (b_mesh.loop_ptex.begin(l); l != b_mesh.loop_ptex.end(); ++l) {
+
+ BL::Image image = l->image();
+
+ // Other alternative is: get data, pack new image here
+ (*slot) = scene->image_manager->add_image
+ ("TODO", image.ptr.data, false, 1,
+ is_float, is_linear, INTERPOLATION_LINEAR, true);
+ }
+ }
+#endif
+
/* create vertex color attributes */
{
BL::Mesh::tessface_vertex_colors_iterator l;
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index eb3f54a..e0db0e1 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -101,8 +101,8 @@ void BlenderSession::create_session()
scene = new Scene(scene_params, session_params.device);
/* setup callbacks for builtin image support */
- scene->image_manager->builtin_image_info_cb = function_bind(&BlenderSession::builtin_image_info, this, _1, _2, _3, _4, _5, _6, _7);
- scene->image_manager->builtin_image_pixels_cb = function_bind(&BlenderSession::builtin_image_pixels, this, _1, _2, _3);
+ scene->image_manager->builtin_image_info_cb = function_bind(&BlenderSession::builtin_image_info, this, _1, _2, _3, _4, _5, _6, _7, _8);
+ scene->image_manager->builtin_image_pixels_cb = function_bind(&BlenderSession::builtin_image_pixels, this, _1, _2, _3, _4, _5);
scene->image_manager->builtin_image_float_pixels_cb = function_bind(&BlenderSession::builtin_image_float_pixels, this, _1, _2, _3);
/* create session */
@@ -927,7 +927,7 @@ int BlenderSession::builtin_image_frame(const string &builtin_name)
return atoi(builtin_name.substr(last + 1, builtin_name.size() - last - 1).c_str());
}
-void BlenderSession::builtin_image_info(const string &builtin_name, void *builtin_data, bool &is_float, int &width, int &height, int &depth, int &channels)
+void BlenderSession::builtin_image_info(const string &builtin_name, void *builtin_data, bool &is_float, int &width, int &height, int &depth, int &channels, bool &is_ptex)
{
/* empty image */
is_float = false;
@@ -953,6 +953,9 @@ void BlenderSession::builtin_image_info(const string &builtin_name, void *builti
height = b_image.size()[1];
depth = 1;
channels = b_image.channels();
+
+ // TODO
+ is_float = false;
}
else if(b_id.is_a(&RNA_Object)) {
/* smoke volume data */
@@ -981,7 +984,8 @@ void BlenderSession::builtin_image_info(const string &builtin_name, void *builti
}
}
-bool BlenderSession::builtin_image_pixels(const string &builtin_name, void *builtin_data, unsigned char *pixels)
+bool BlenderSession::builtin_image_pixels(const string &builtin_name, void *builtin_data, unsigned char *pixels,
+ void **ptex_table, int *ptex_table_len)
{
if(!builtin_data)
return false;
@@ -1019,6 +1023,20 @@ bool BlenderSession::builtin_image_pixels(const string &builtin_name, void *buil
}
}
+ {
+ //b_image.ptex_table();
+
+
+ BL::DynamicArray<float> table = b_image.ptex_table();
+ (*ptex_table_len) = table.length / 4;
+ // TODO
+ (*ptex_table) = table.data;
+ table.data = NULL;
+
+ //memcpy((*ptex_table) = b_image.ptex_table();
+ //(*ptex_table_len) = b_image.ptex_table_len();
+ }
+
/* premultiply, byte images are always straight for blender */
unsigned char *cp = pixels;
for(int i = 0; i < width * height; i++, cp += channels) {
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index 33da307..65a4c57 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -104,8 +104,9 @@ protected:
void do_write_update_render_tile(RenderTile& rtile, bool do_update_only);
int builtin_image_frame(const string &builtin_name);
- void builtin_image_info(const string &builtin_name, void *builtin_data, bool &is_float, int &width, int &height, int &depth, int &channels);
- bool builtin_image_pixels(const string &builtin_name, void *builtin_data, unsigned char *pixels);
+ void builtin_image_info(const string &builtin_name, void *builtin_data, bool &is_float, int &width, int &height, int &depth, int &channels, bool &is_ptex);
+ bool builtin_image_pixels(const string &builtin_name, void *builtin_data, unsigned char *pixels,
+ void **ptex_table, int *ptex_table_len);
bool builtin_image_float_pixels(const string &builtin_name, void *builtin_data, float *pixels);
};
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index 806eae7..5797624 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -591,6 +591,37 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
get_tex_mapping(&image->tex_mapping, b_image_node.texture_mapping());
node = image;
}
+ else if (b_node.is_a(&RNA_ShaderNodeTexPtex)) {
+ // TODO
+ BL::ShaderNodeTexPtex b_image_node(b_node);
+ //BL::Image b_image(b_image_node.image());
+ PtexTextureNode *image = new PtexTextureNode();
+ image->ptex = true;
+ image->ptex_layer = "TODO";
+ // if(b_image) {
+ // int scene_frame = b_scene.frame_current();
+ // int image_frame = image_user_frame_number(b_image_node.image_user(), scene_frame);
+ // image->filename = b_image.name() + "@" + string_printf("%d", image_frame);
+ // image->builtin_data = b_image.ptr.data;
+
+
+ // image->animated = b_image_node.image_user().use_auto_refresh();
+ // image->use_alpha = b_image.use_alpha();
+
+ // /* TODO(sergey): Does not work properly when we change builtin type. */
+ // if (b_image.is_updated()) {
+ // scene->image_manager->tag_reload_image(image->filename,
+ // image->builtin_data,
+ // (InterpolationType)b_image_node.interpolation());
+ // }
+ // }
+ // image->color_space = ImageTextureNode::color_space_enum[(int)b_image_node.color_space()];
+ // image->projection = ImageTextureNode::projection_enum[(int)b_image_node.projection()];
+ // image->interpolation = (InterpolationType)b_image_node.interpolation();
+ // image->projection_blend = b_image_node.projection_blend();
+ // get_tex_mapping(&image->tex_mapping, b_image_node.texture_mapping());
+ node = image;
+ }
else if (b_node.is_a(&RNA_ShaderNodeTexEnvironment)) {
BL::ShaderNodeTexEnvironment b_env_node(b_node);
BL::Image b_image(b_env_node.image());
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 77d3ea8..19452b9 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -534,6 +534,7 @@ typedef enum AttributeStandard {
ATTR_STD_VOLUME_FLAME,
ATTR_STD_VOLUME_HEAT,
ATTR_STD_VOLUME_VELOCITY,
+ ATTR_STD_PTEX_LAYER,
ATTR_STD_NUM,
ATTR_STD_NOT_FOUND = ~0
diff --git a/intern/cycles/kernel/svm/svm.h b/intern/cycles/kernel/svm/svm.h
index 3465a74..bc47020 100644
--- a/intern/cycles/kernel/svm/svm.h
+++ b/intern/cycles/kernel/svm/svm.h
@@ -244,6 +244,9 @@ ccl_device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, Shade
case NODE_TEX_IMAGE_BOX:
svm_node_tex_image_box(kg, sd, stack, node);
break;
+ case NODE_TEX_PTEX:
+ svm_node_tex_ptex(kg, sd, stack, node);
+ break;
case NODE_TEX_ENVIRONMENT:
svm_node_tex_environment(kg, sd, stack, node);
break;
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index 3f1f956..61fe0aa 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -380,6 +380,11 @@ ccl_device void svm_node_tex_image(KernelGlobals *kg, ShaderData *sd, float *sta
float4 f;
+ // TODO
+ if (srgb & 4) {
+ id = stack_load_int(stack, id);
+ }
+
if (srgb & 2) {
assert(co.x >= 0 && co.x <= 1);
assert(co.y >= 0 && co.y <= 1);
@@ -403,6 +408,9 @@ ccl_device void svm_node_tex_image(KernelGlobals *kg, ShaderData *sd, float *sta
float2 ptex_uv = ptex_origin + make_float2(co.x, co.y) * ptex_res;
ptex_uv /= tex_size;
+ // TODO :(
+ id = 1024;
+
f = svm_image_texture(kg, id, ptex_uv.x, ptex_uv.y, srgb,
use_alpha);
}
@@ -416,6 +424,12 @@ ccl_device void svm_node_tex_image(KernelGlobals *kg, ShaderData *sd, float *sta
stack_store_float(stack, alpha_offset, f.w);
}
+ccl_device void svm_node_tex_ptex(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
+{
+ // TODO
+ svm_node_tex_image(kg, sd, stack, node);
+}
+
ccl_device void svm_node_tex_image_box(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
{
/* get object space normal */
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index a8d0da6..5dbc40f 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -40,6 +40,7 @@ typedef enum NodeType {
NODE_JUMP_IF_ONE,
NODE_TEX_IMAGE,
NODE_TEX_IMAGE_BOX,
+ NODE_TEX_PTEX,
NODE_TEX_SKY,
NODE_GEOMETRY,
NODE_GEOMETRY_DUPLI,
diff --git a/intern/cycles/render/attribute.cpp b/intern/cycles/render/attribute.cpp
index 15d7134..2ec38f1 100644
--- a/intern/cycles/render/attribute.cpp
+++ b/intern/cycles/render/attribute.cpp
@@ -230,6 +230,8 @@ const char *Attribute::standard_name(AttributeStandard std)
return "heat";
case ATTR_STD_VOLUME_VELOCITY:
return "velocity";
+ case ATTR_STD_PTEX_LAYER:
+ return "ptex_layer";
case ATTR_STD_NOT_FOUND:
case ATTR_STD_NONE:
case ATTR_STD_NUM:
@@ -375,6 +377,9 @@ Attribute *AttributeSet::add(AttributeStandard std, ustring name)
case ATTR_STD_VOL
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list