Commit: 8be6b5aab80a303cc1f96c1a1ece2fd65f9a2241
Author: Nicholas Bishop
Date:   Mon Jan 19 20:04:27 2015 +0100
Branches: cycles-ptex-12
https://developer.blender.org/rB8be6b5aab80a303cc1f96c1a1ece2fd65f9a2241

WIP cycles packed texture stuff

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

M       intern/cycles/CMakeLists.txt
M       intern/cycles/kernel/kernel_textures.h
M       intern/cycles/kernel/svm/svm_image.h
M       intern/cycles/render/image.cpp
M       intern/cycles/render/image.h
M       intern/cycles/render/nodes.cpp
M       intern/cycles/render/scene.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/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/svm/svm_image.h 
b/intern/cycles/kernel/svm/svm_image.h
index e667fc2..3f1f956 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -377,7 +377,38 @@ 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;
+
+       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);
+               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/image.cpp b/intern/cycles/render/image.cpp
index 61a0a81..25a171f 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 "bl_ptex.h"
+#endif
+
 CCL_NAMESPACE_BEGIN
 
 ImageManager::ImageManager()
@@ -39,6 +43,11 @@ ImageManager::ImageManager()
        tex_num_images = TEX_NUM_IMAGES;
        tex_num_float_images = TEX_NUM_FLOAT_IMAGES;
        tex_image_byte_start = TEX_IMAGE_BYTE_START;
+
+#ifdef WITH_PTEX
+       size_t maxmem = 16384 * 1024;
+       ptex_cache = PtexCache::create(0, maxmem);
+#endif
 }
 
 ImageManager::~ImageManager()
@@ -348,7 +357,8 @@ void ImageManager::tag_reload_image(const string& filename, 
void *builtin_data,
        }
 }
 
-bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img)
+bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img,
+                                                                  DeviceScene 
*dscene, int slot)
 {
        if(img->filename == "")
                return false;
@@ -356,7 +366,22 @@ bool ImageManager::file_load_image(Image *img, 
device_vector<uchar4>& tex_img)
        ImageInput *in = NULL;
        int width, height, depth, components;
 
-       if(!img->builtin_data) {
+       PtexPackedTexture *ppt = ptex_packed_texture_new();
+       bool use_ptex = false;
+       if(string_endswith(img->filename, ".ptx")) {
+               // Arbitrary choice for now...
+               width = 1 << 10;
+
+               ptex_packed_texture_fill(ppt, img->filename.c_str(),
+                                                                width, 
(PtexCacheHandle*)ptex_cache);
+
+               height = ptex_packed_texture_height(ppt);
+               depth = 1;
+               components = ptex_packed_texture_num_channels(ppt);
+
+               use_ptex = true;
+       }
+       else if(!img->builtin_data) {
                /* load image from file through OIIO */
                in = ImageInput::create(img->filename);
 
@@ -421,6 +446,43 @@ bool ImageManager::file_load_image(Image *img, 
device_vector<uchar4>& tex_img)
                in->close();
                delete in;
        }
+       else if (use_ptex) {
+               memcpy(pixels, ptex_packed_texture_texels(ppt),
+                          width * height * components);
+               // OK, silly encoding for now...
+               // [0 - TEX_EXTENDED_NUM_IMAGES_CPU] = offset to data index
+               // data starts with width/height pair
+               // rest is pairs of x/y coords
+               if (dscene->ptex_table.size() == 0) {
+                       dscene->ptex_table.resize(TEX_EXTENDED_NUM_IMAGES_CPU);
+               }
+
+               uint offset = dscene->ptex_table.size();
+               const int table_len = ptex_packed_texture_table_len(ppt);
+               uint *table_data = dscene->ptex_table.resize(offset +
+                                                                               
                         2 +
+                                                                               
                         (4 * table_len));
+               table_data[slot] = offset;
+               table_data[offset] = width;
+               offset++;
+               table_data[offset] = height;
+               offset++;
+
+               for (uint i = 0; i < table_len; i++) {
+                       const PtexTableElement &elem = 
*ptex_packed_texture_table_elem(ppt, i);
+
+                       table_data[offset] = elem.co[0];
+                       offset++;
+                       table_data[offset] = elem.co[1];
+                       offset++;
+                       table_data[offset] = elem.res[0];
+                       offset++;
+                       table_data[offset] = elem.res[1];
+                       offset++;
+               }
+
+                ptex_packed_texture_delete(ppt);
+       }
        else {
                builtin_image_pixels_cb(img->filename, img->builtin_data, 
pixels);
        }
@@ -675,7 +737,7 @@ void ImageManager::device_load_image(Device *device, 
DeviceScene *dscene, int sl
                        device->tex_free(tex_img);
                }
 
-               if(!file_load_image(img, tex_img)) {
+               if(!file_load_image(img, tex_img, dscene, slot)) {
                        /* on failure to load, we set a 1x1 pixels pink image */
                        uchar *pixels = (uchar*)tex_img.resize(1, 1);
 
@@ -788,6 +850,8 @@ void ImageManager::device_update(Device *device, 
DeviceScene *dscene, Progress&
        if(pack_images)
                device_pack_images(device, dscene, progress);
 
+       device->tex_alloc("__ptex_table", dscene->ptex_table);
+
        need_update = false;
 }
 
@@ -864,9 +928,11 @@ void ImageManager::device_free(Device *device, DeviceScene 
*dscene)
 
        device->tex_free(dscene->tex_image_packed);
        device->tex_free(dscene->tex_image_packed_info);
+       device->tex_free(dscene->ptex_table);
 
        dscene->tex_image_packed.clear();
        dscene->tex_image_packed_info.clear();
+       dscene->ptex_table.clear();
 
        images.clear();
        float_images.clear();
diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h
index 2f5dcb6..231156a 100644
--- a/intern/cycles/render/image.h
+++ b/intern/cycles/render/image.h
@@ -26,6 +26,10 @@
 
 #include "kernel_types.h"  /* for TEX_NUM_FLOAT_IMAGES */
 
+#ifdef WITH_PTEX
+class PtexCache;
+#endif
+
 CCL_NAMESPACE_BEGIN
 
 /* generic */
@@ -102,7 +106,12 @@ private:
        void *osl_texture_system;
        bool pack_images;
 
-       bool file_load_image(Image *img, device_vector<uchar4>& tex_img);
+#ifdef WITH_PTEX
+       PtexCache *ptex_cache;
+#endif
+
+       bool file_load_image(Image *img, device_vector<uchar4>& tex_img,
+                                                DeviceScene *dscene, int slot);
        bool file_load_float_image(Image *img, device_vector<float4>& tex_img);
 
        void device_load_image(Device *device, DeviceScene *dscene, int slot, 
Progress *progess);
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 3ea80a5..9eb18af 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -261,6 +261,11 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
                compiler.stack_assign(vector_in);
 
                int srgb = (is_linear || color_space != "Color")? 0: 1;
+               // TODO(nicholasbishop): clean this up of course
+               int flags = srgb;
+               if (string_endswith(filename, ".ptx")) {
+                       flags |= 2;
+               }
                int vector_offset = vector_in->stack_offset;
 
                if(!tex_mapping.skip()) {
@@ -275,7 +280,7 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
                                        vector_offset,
                                        color_out->stack_offset,
                                        alpha_out->stack_offset,
-                                       srgb),
+                                       flags),
                                projection_enum[projection]);
                }
                else {
@@ -285,7 +290,7 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
                                        vector_offset,
                                        color_out->stack_offset,
                                        alpha_out->stack_offset,
-                                       srgb),
+                                       flags & 1),
                                __float_as_int(projection_blend));
                }
 
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index 53c3a95..781d0b4 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -108,6 +108,9 @@ public:
        /* integrator */
        device_vector<uint> sobol_directions;
 
+       /* ptex */
+       device_vector<uint> ptex_table;
+
        /* cpu images */
        device_vector<uchar4> tex_image[TEX_EXTENDED_NUM_IMAGES_CPU];
        device_vector<float4> tex_float_image[TEX_EXTENDED_NUM_FLOAT_IMAGES];

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

Reply via email to