[Bf-blender-cvs] [1906a4f] cycles-ptex-06: checkpoint
Nicholas Bishop
noreply at git.blender.org
Thu Jan 15 20:13:21 CET 2015
Commit: 1906a4fb09e5f7393bd4a35f93d506144621578e
Author: Nicholas Bishop
Date: Tue Jan 13 16:09:46 2015 +0100
Branches: cycles-ptex-06
https://developer.blender.org/rB1906a4fb09e5f7393bd4a35f93d506144621578e
checkpoint
===================================================================
M intern/cycles/blender/blender_mesh.cpp
M intern/cycles/kernel/svm/svm_image.h
M intern/cycles/render/image.cpp
===================================================================
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 60e9fcb..df3e31a 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -437,18 +437,18 @@ static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<
fdata[0] = get_float3(t->uv1());
fdata[1] = get_float3(t->uv2());
fdata[2] = get_float3(t->uv3());
- fdata[0].z = (float)ptex_face_id;
- fdata[1].z = (float)ptex_face_id;
- fdata[2].z = (float)ptex_face_id;
+ fdata[0].z = ptex_face_id;
+ fdata[1].z = ptex_face_id;
+ fdata[2].z = ptex_face_id;
fdata += 3;
if(nverts[i] == 4) {
fdata[0] = get_float3(t->uv1());
fdata[1] = get_float3(t->uv3());
fdata[2] = get_float3(t->uv4());
- fdata[0].z = (float)ptex_face_id;
- fdata[1].z = (float)ptex_face_id;
- fdata[2].z = (float)ptex_face_id;
+ fdata[0].z = ptex_face_id;
+ fdata[1].z = ptex_face_id;
+ fdata[2].z = ptex_face_id;
fdata += 3;
}
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index 6cafa52..b4c624a 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -395,33 +395,33 @@ ccl_device void svm_node_tex_image(KernelGlobals *kg, ShaderData *sd, float *sta
float3 co = stack_load_float3(stack, co_offset);
uint use_alpha = stack_valid(alpha_offset);
+ 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];
+ uint face_id = (uint)(co[2] + 0.5f);
uint offset = kernel_tex_fetch(__ptex_table, id);
- float tex_width = (float)kernel_tex_fetch(__ptex_table, offset);
- offset++;
- float tex_height = (float)kernel_tex_fetch(__ptex_table, offset);
- offset++;
- offset += 3 * face_id;
- uint origin_x = kernel_tex_fetch(__ptex_table, offset);
- offset++;
- uint origin_y = kernel_tex_fetch(__ptex_table, offset);
- offset++;
- uint ures = kernel_tex_fetch(__ptex_table, offset);
- offset++;
- uint vres = kernel_tex_fetch(__ptex_table, offset);
- offset++;
-
- float xco = (float)origin_x + co.x * ures;
- float yco = (float)origin_y + co.y * ures;
-
- float uco = (float)xco / tex_width;
- float vco = (float)yco / tex_height;
-
- float4 f = svm_image_texture(kg, id, uco, vco, srgb, use_alpha);
- f.x = co[0];
- f.y = co[1];
- f.z = 0;
+ 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, 1 - co.y) * ptex_res;
+ ptex_uv /= tex_size;
+
+ float4 f = svm_image_texture(kg, id, ptex_uv.x, ptex_uv.y, srgb,
+ use_alpha);
+ /* f.x = face_id / 20.0f; */
+ /* f.y = 0; */
+ /* f.z = 0; */
//float4 f = svm_image_texture(kg, id, co.x, co.y, srgb, use_alpha);
if(stack_valid(out_offset))
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index ef69ba0..d3a0717 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -33,22 +33,20 @@
CCL_NAMESPACE_BEGIN
-struct PtexXY {
- uint x, y;
- uint ures, vres;
+struct PtexTableElement {
+ uint co[2];
+ uint res[2];
};
-typedef std::map<int, PtexXY> PtexCoordMap;
-
struct PtexPackedTexture {
PtexPackedTexture() : width(0), height(0) {}
vector<uint8_t> texels;
- PtexCoordMap face_coord_map;
+ vector<PtexTableElement> table;
- int width;
- int height;
+ uint width;
+ uint height;
int num_channels;
@@ -66,14 +64,6 @@ struct PtexPackedTexture {
}
};
-struct OrdVal {
- vector<int> face_ids;
- int elem_width;
- int elem_per_row;
- int num_rows;
- int ures, vres;
-};
-
static int ptex_data_type_size_in_bytes(const Ptex::DataType dt)
{
switch (dt) {
@@ -91,9 +81,15 @@ static int ptex_data_type_size_in_bytes(const Ptex::DataType dt)
return 0;
}
+static void ptex_read_border_pixel(PtexFaceData &face, const Ptex::EdgeId,
+ const float t, void *output)
+{
+ face.
+}
+
// TODO
static bool ptex_pack(PtexPackedTexture *output, const char *path,
- const int width, PtexCache *ptex_cache) {
+ const uint width, PtexCache *ptex_cache) {
Ptex::String error;
PtexPtr<PtexTexture> r(ptex_cache->get(path, error));
@@ -102,49 +98,61 @@ static bool ptex_pack(PtexPackedTexture *output, const char *path,
return false;
}
- // TODO: for now packing all faces as squares
+ // Size of filter border, in pixels
+ const uint border = 1;
- // Sorted, res -> face_id array. int8_t matches Ptex api
-
- typedef std::map<int, OrdVal> Ord;
- Ord ord;
+ const uint num_faces = r->numFaces();
+ output->table.resize(num_faces);
- const uint border = 1;
+ // Sort faces by vres
+ typedef std::multimap<uint, uint> SortedFaceIds;
+ SortedFaceIds sorted_face_ids;
- const int num_faces = r->numFaces();
- for (int face_index = 0; face_index < num_faces; face_index++) {
- const Ptex::FaceInfo &face_info = r->getFaceInfo(face_index);
+ for (uint face_id = 0; face_id < num_faces; face_id++) {
+ const Ptex::FaceInfo &face_info = r->getFaceInfo(face_id);
const Ptex::Res &res = face_info.res;
- const int larger = std::max(res.u(), res.v());
- if (ord.find(larger) == ord.end()) {
- ord[larger] = OrdVal();
- }
-
- ord[larger].face_ids.push_back(face_index);
+ sorted_face_ids.insert(std::make_pair(res.v(), face_id));
- ord[larger].ures = res.u() + 2 * border;
- ord[larger].vres = res.v() + 2 * border;
+ PtexTableElement &table_elem = output->table[face_id];
+ table_elem.res[0] = res.u();
+ table_elem.res[1] = res.v();
}
- // TODO: for now only packing mipmap level zero
+ // TODO: check that largest res isn't above texture width
+
+ // For now only packing mipmap level zero
- // Calc size
+ // Calc layout
output->width = width;
output->height = 0;
- for (Ord::iterator iter = ord.begin(); iter != ord.end(); ++iter) {
- OrdVal &val = iter->second;
- const int res = iter->first;
+ uint dst_x = 0;
+ uint dst_y = 0;
+ uint yinc = 0;
+ for (SortedFaceIds::const_reverse_iterator iter =
+ sorted_face_ids.rbegin();
+ iter != sorted_face_ids.rend(); ++iter) {
+ const uint face_id = iter->second;
+
+ PtexTableElement &elem = output->table[face_id];
+
+ // Check if enough room on this row
+ if (dst_x + elem.res[0] + 2 * border >= output->width) {
+ // Move to next row
+ assert(yinc != 0);
+ dst_y += yinc;
+ yinc = 0;
+ dst_x = 0;
+ }
- val.elem_width = border + res + border;
- val.elem_per_row = output->width / val.elem_width;
- const int num_elem = val.face_ids.size();
+ // Write final position
+ elem.co[0] = dst_x + border;
+ elem.co[1] = dst_y + border;
- val.num_rows = num_elem / val.elem_per_row;
- if ((num_elem % val.elem_per_row) != 0) {
- val.num_rows += 1;
- }
+ dst_x += elem.res[0] + 2 * border;
+ output->height = std::max(output->height,
+ dst_y + elem.res[1] + 2 * border);
- output->height += val.elem_width * val.num_rows;
+ yinc = std::max(yinc, elem.res[1] + 2 * border);
}
@@ -157,46 +165,30 @@ static bool ptex_pack(PtexPackedTexture *output, const char *path,
texel_size_in_bytes);
// Copy face textures
- uint dst_y = 0;
- bool yinc = false;
-
const int dst_stride = output->width * texel_size_in_bytes;
- for (Ord::const_iterator iter = ord.begin(); iter != ord.end(); ++iter) {
- const OrdVal &val = iter->second;
- const int num_elem = val.face_ids.size();
- int column = 0;
- uint dst_x = 0;
-
- for (int i = 0; i < num_elem; i++) {
- const int face_id = val.face_ids[i];
+ for (SortedFaceIds::const_iterator iter = sorted_face_ids.begin();
+ iter != sorted_face_ids.end(); ++iter) {
+ const uint face_id = iter->second;
+ PtexTableElement &elem = output->table[face_id];
- PtexXY coord = {dst_x + border, dst_y + border, (uint)val.ures, (uint)val.vres};
- output->face_coord_map[face_id] = coord;
+ const int dst_offset = ((elem.co[1] * output->width + elem.co[0]) *
+ texel_size_in_bytes);
- const int dst_offset = ((coord.y * output->width + coord.x) *
- texel_size_in_bytes);
+ r->getData(face_id, output->texels.data() + dst_offset, dst_stride);
- r->getData(face_id,
- output->texels.data() + dst_offset,
- dst_stride);
+ // Fill in borders
+ const Ptex::FaceInfo &info = r->getFaceInfo(face_id);
+ for (int i = 0; i < 4; i++) {
+ const int adjface = info.adjface(i);
+ const Ptex::EdgeId adjedge = info.adjedge(i);
- // TODO: have to fill in borders too...
+ // TODO: handle subfaces correctly
- dst_x += val.elem_width;
- yinc = true;
-
- column += 1;
- if (column == val.elem_per_row) {
- column = 0;
- dst_x = 0;
- dst_y += val.elem_width;
- yinc = false;
+ const PtexFaceData *face_data = r->getData(adjface);
+ for (int j = 0; j < elem.res[i % 2 == 0 ? 0 : 1]; j++) {
+
}
- }
-
- if (yinc) {
- dst_y += val.elem_width;
- yinc = false;
+ break;
}
}
@@ -633,24 +625,23 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img,
uint *table_data = dscene->ptex_table.resize(offset +
2 +
(4 * ptex_packed_texture.
- face_coord_map.size()));
+ table.size()));
table_data[slot] = offset;
table_data[offset] = width;
offset++;
table_data[offset] = height;
offset++;
- // oops, don't need map here key is contiguous
- for (PtexCoordMap::const_iterator iter =
- ptex_packed_texture.face_coord_map.begin();
- iter != ptex_packed_texture.face_coord_map.end();
- ++iter) {
- table_data[offset] = iter->second.x;
+
+ for (uint i = 0; i < ptex_packed_texture.table.size(); i++) {
+ const PtexTableElement &elem = ptex_packed_texture.table[i];
+
+ table_data[offset] = elem.co[0];
offset++;
- table_data[offs
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list