Commit: 964285c25e299589b013893be0cf9b7fe36606db
Author: Nicholas Bishop
Date:   Mon Jan 19 20:04:27 2015 +0100
Branches: cycles-ptex-49
https://developer.blender.org/rB964285c25e299589b013893be0cf9b7fe36606db

Add Ptex support to Cycles image node, also add Ptex node

===================================================================

M       intern/cycles/CMakeLists.txt
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_textures.h
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/kernel/svm/svm_image.h
M       intern/cycles/render/attribute.cpp
M       intern/cycles/render/image.cpp
M       intern/cycles/render/image.h
M       intern/cycles/render/nodes.cpp
M       intern/cycles/render/nodes.h
M       intern/cycles/render/scene.h
M       intern/cycles/util/util_types.h

===================================================================

diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt
index 2ba6af4..34a5195 100644
--- a/intern/cycles/CMakeLists.txt
+++ b/intern/cycles/CMakeLists.txt
@@ -129,9 +129,10 @@ if(WITH_CYCLES_STANDALONE_GUI)
        add_definitions(-DWITH_CYCLES_STANDALONE_GUI)
 endif()
 
-if(WITH_CYCLES_PTEX)
+#if(WITH_CYCLES_PTEX)
        add_definitions(-DWITH_PTEX)
-endif()
+       include_directories("../../extern/ptex")
+#endif()
 
 if(WITH_CYCLES_OPENSUBDIV)
        add_definitions(-DWITH_OPENSUBDIV)
diff --git a/intern/cycles/blender/blender_session.cpp 
b/intern/cycles/blender/blender_session.cpp
index eb3f54a..db70bad 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, int &num_ptex_regions)
 {
        /* empty image */
        is_float = false;
@@ -953,6 +953,10 @@ void BlenderSession::builtin_image_info(const string 
&builtin_name, void *builti
                height = b_image.size()[1];
                depth = 1;
                channels = b_image.channels();
+
+               // TODO: ptex
+               is_float = false;
+               num_ptex_regions = b_image.ptex_regions().length;
        }
        else if(b_id.is_a(&RNA_Object)) {
                /* smoke volume data */
@@ -981,7 +985,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,
+                                                                               
  PtexRegions ptex_regions, const int num_ptex_regions)
 {
        if(!builtin_data)
                return false;
@@ -1019,6 +1024,14 @@ bool BlenderSession::builtin_image_pixels(const string 
&builtin_name, void *buil
                }
        }
 
+       {
+               // TODO
+               BL::DynamicArray<int> regions = b_image.ptex_regions();
+               assert(num_ptex_regions == regions.length);
+               memcpy(ptex_regions, regions.data,
+                          sizeof(**ptex_regions) * num_ptex_regions);
+       }
+
        /* 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..0eeabda 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, int 
&num_ptex_regions);
+       bool builtin_image_pixels(const string &builtin_name, void 
*builtin_data, unsigned char *pixels,
+                                                         PtexRegions 
ptex_regions, int num_ptex_regions);
        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 baf79a7..c141b9e 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -577,6 +577,9 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData 
b_data, BL::Scene b_scen
                        image->animated = 
b_image_node.image_user().use_auto_refresh();
                        image->use_alpha = b_image.use_alpha();
 
+                       // TODO(nicholasbishop)
+                       image->ptex = string_endswith(image->filename, ".ptx");
+
                        /* TODO(sergey): Does not work properly when we change 
builtin type. */
                        if (b_image.is_updated()) {
                                
scene->image_manager->tag_reload_image(image->filename,
@@ -591,6 +594,15 @@ 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);
+               PtexTextureNode *image = new PtexTextureNode();
+
+               image->ptex = true;
+               image->ptex_layer = b_image_node.layer_name();
+               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_textures.h 
b/intern/cycles/kernel/kernel_textures.h
index 374dc6d..ca2da1f 100644
--- a/intern/cycles/kernel/kernel_textures.h
+++ b/intern/cycles/kernel/kernel_textures.h
@@ -71,6 +71,9 @@ KERNEL_TEX(float, texture_float, __lookup_table)
 /* sobol */
 KERNEL_TEX(uint, texture_uint, __sobol_directions)
 
+/* ptex */
+KERNEL_TEX(uint, texture_uint, __ptex_table)
+
 /* full-float image */
 KERNEL_IMAGE_TEX(float4, texture_image_float4, __tex_image_float_000)
 KERNEL_IMAGE_TEX(float4, texture_image_float4, __tex_image_float_001)
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_image.h 
b/intern/cycles/kernel/svm/svm_image.h
index e667fc2..139c637 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -377,7 +377,57 @@ ccl_device void svm_node_tex_image(KernelGlobals *kg, 
ShaderData *sd, float *sta
                co = texco_remap_square(co);
                map_to_tube(&co.x, &co.y, co.x, co.y, co.z);
        }
-       float4 f = svm_image_texture(kg, id, co.x, co.y, srgb, use_alpha);
+
+       float4 f;
+
+       // TODO
+       bool err = false;
+       if (srgb & 4) {
+               AttributeElement ae;
+               int image_attr_offset = find_attribute(kg, sd, id, &ae);
+               if(image_attr_offset == ATTR_STD_NOT_FOUND) {
+                       /* Error */
+                       err = true;
+               }
+               else {
+                       float fid = kernel_tex_fetch(__attributes_float,
+                                                                               
 image_attr_offset);
+                       id = (int)(fid + 0.5f);
+               }
+       }
+
+       if (err) {
+               f = make_float4(1.0f, 0.0f, 1.0f, 1.0f);
+       }
+       else if (srgb & 2) {
+               assert(co.x >= 0 && co.x <= 1);
+               assert(co.y >= 0 && co.y <= 1);
+
+               // TODO: test hacks for Ptex
+               uint face_id = (uint)(co[2] + 0.5f);
+               uint offset = kernel_tex_fetch(__ptex_table, id - /* TODO */ 
1024);
+               float2 tex_size =
+                       make_float2((float)kernel_tex_fetch(__ptex_table, 
offset + 0),
+                                               
(float)kernel_tex_fetch(__ptex_table, offset + 1));
+               offset += 2;
+               offset += 4 * face_id;
+
+               float2 ptex_origin =
+                       make_float2((float)kernel_tex_fetch(__ptex_table, 
offset + 0),
+                                               
(float)kernel_tex_fetch(__ptex_table, offset + 1));
+               float2 ptex_res =
+                       make_float2((float)kernel_tex_fetch(__ptex_table, 
offset + 2),
+                                               
(float)kernel_tex_fetch(__ptex_table, offset + 3));
+
+               float2 ptex_uv = ptex_origin + make_float2(co.x, co.y) * 
ptex_res;
+               ptex_uv /= tex_size;
+
+               f = svm_image_texture(kg, id, ptex_uv.x, ptex_uv.y, srgb,
+                                                                        
use_alpha);
+       }
+       else {
+               f = svm_image_texture(kg, id, co.x, co.y, srgb, use_alpha);
+       }
 
        if(stack_valid(out_offset))
                stack_store_float3(stack, out_offset, make_float3(f.x, f.y, 
f.z));
diff --git a/intern/cycles/render/attribute.cpp 
b/intern/cycles/render/attribute.cpp
index 15d7134..fbd751f 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_VOLUME_VELOCITY:
                                attr = add(name, TypeDesc::TypeVector, 
ATTR_ELEMENT_VOXEL);
                                break;
+                       case ATTR_STD_PTEX_LAYER:
+                               attr = add(name, TypeDesc::TypeFloat, 
ATTR_ELEMENT_MESH);
+                               break;
                        default:
                                assert(0);
                                break;
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index 61a0a81..3eb6bd5 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -27,6 +27,10 @@
 #include <OSL/oslexec.h>
 #endif
 
+#ifdef WITH_PTEX
+#include "BPX_pack.h"
+#endif
+
 CCL_NAMESPACE_BEGIN
 
 ImageManager::ImageManager()
@@ -96,7 +100,8 @@ bool ImageManager::is_float_image(const string& filename, 
void *builtin_data, bo
        if(builtin_data) {
                if(builtin_image_info_cb) {
                        int width, height, depth, channels;
-                       builtin_image_info_cb(filename, builtin_data, is_float, 
width, height, depth, channels);
+                       int num_ptex_regions;
+                       builtin_image_info_cb(filename, builtin_data, is_float, 
width, hei

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to