1 #include <iostream>
2 #include <stdlib.h>
3 #include <algorithm>
4 #include "Ptexture.h"
5 #include "PtexHalf.h"
6 #include <string.h>
7 using namespace Ptex;
8 
writeMeta(PtexWriter * w,const char * sval,double * dvals,int ndvals,int16_t * ivals,int nivals,const char * xval)9 void writeMeta(PtexWriter* w,
10                const char* sval, double* dvals, int ndvals, int16_t* ivals, int nivals,
11                const char* xval)
12 {
13     if (sval) w->writeMeta("sval", sval);
14     if (dvals) w->writeMeta("dvals", dvals, ndvals);
15     if (ivals) w->writeMeta("ivals", ivals, nivals);
16     if (xval) w->writeMeta("xval", xval);
17 }
18 
19 
checkMeta(const char * path,const char * sval,double * dvals,int ndvals,int16_t * ivals,int nivals,const char * xval)20 bool checkMeta(const char* path,
21                const char* sval, double* dvals, int ndvals, int16_t* ivals, int nivals,
22                const char* xval)
23 {
24     Ptex::String error;
25     PtexPtr<PtexTexture> tx(PtexTexture::open(path, error));
26     if (!tx) {
27         std::cerr << error.c_str() << std::endl;
28         return 0;
29     }
30     PtexPtr<PtexMetaData> meta(tx->getMetaData());
31 
32     const char* f_sval;
33     meta->getValue("sval", f_sval);
34 
35     const double* f_dvals;
36     int f_ndvals;
37     meta->getValue("dvals", f_dvals, f_ndvals);
38 
39     const int16_t* f_ivals;
40     int f_nivals;
41     meta->getValue("ivals", f_ivals, f_nivals);
42 
43     const char* f_xval;
44     meta->getValue("xval", f_xval);
45 
46     bool ok = ((!sval || 0==strcmp(sval, f_sval)) &&
47                (!ndvals || (ndvals == f_ndvals &&
48                             0==memcmp(dvals, f_dvals,
49                                       ndvals * sizeof(dvals[0])))) &&
50                (!nivals || (nivals == f_nivals &&
51                             0==memcmp(ivals, f_ivals,
52                                       nivals*sizeof(ivals[0])))) &&
53                (!xval || 0==strcmp(xval, f_xval)));
54     if (!ok) {
55         std::cerr << "Meta data readback failed" << std::endl;
56         return 0;
57     }
58     return 1;
59 }
60 
61 
main(int,char **)62 int main(int /*argc*/, char** /*argv*/)
63 {
64     static Ptex::Res res[] = { Ptex::Res(8,7),
65                                Ptex::Res(0x0201),
66                                Ptex::Res(3,1),
67                                Ptex::Res(0x0405),
68                                Ptex::Res(9,8),
69                                Ptex::Res(0x0402),
70                                Ptex::Res(6,2),
71                                Ptex::Res(0x0407),
72                                Ptex::Res(2,1)};
73     static int adjedges[][4] = {{ 2, 3, 0, 1 },
74                                 { 2, 3, 0, 1 },
75                                 { 2, 3, 0, 1 },
76                                 { 2, 3, 0, 1 },
77                                 { 2, 3, 0, 1 },
78                                 { 2, 3, 0, 1 },
79                                 { 2, 3, 0, 1 },
80                                 { 2, 3, 0, 1 },
81                                 { 2, 3, 0, 1 }};
82     static int adjfaces[][4] ={{ 3, 1, -1, -1 },
83                                { 4, 2, -1, 0 },
84                                { 5, -1, -1, 1 },
85                                { 6, 4, 0, -1 },
86                                { 7, 5, 1, 3 },
87                                { 8, -1, 2, 4 },
88                                { -1, 7, 3, -1 },
89                                { -1, 8, 4, 6 },
90                                { -1, -1, 5, 7 }};
91 
92     int nfaces = sizeof(res)/sizeof(res[0]);
93     Ptex::DataType dt = Ptex::dt_uint16;
94     float ptexOne = Ptex::OneValue(dt);
95     typedef uint16_t Dtype;
96     int alpha = -1;
97     int nchan = 3;
98 
99     Ptex::String error;
100     PtexWriter* w =
101         PtexWriter::open("test.ptx", Ptex::mt_quad, dt, nchan, alpha, nfaces, error);
102     if (!w) {
103         std::cerr << error.c_str() << std::endl;
104         return 1;
105     }
106     int size = 0;
107     for (int i = 0; i < nfaces; i++)
108         size = std::max(size, res[i].size());
109     size *= Ptex::DataSize(dt) * nchan;
110 
111     void* buff = malloc(size);
112     for (int i = 0; i < nfaces; i++)
113     {
114         memset(buff, 0, size);
115         Dtype* fbuff = (Dtype*)buff;
116         int ures = res[i].u(), vres = res[i].v();
117         for (int v = 0; v < vres; v++) {
118             for (int u = 0; u < ures; u++) {
119                 float c = (u ^ v) & 1;
120                 fbuff[(v*ures+u)*nchan] = u/float(ures-1) * ptexOne;
121                 fbuff[(v*ures+u)*nchan+1] = v/float(vres-1) * ptexOne;
122                 fbuff[(v*ures+u)*nchan+2] = c * ptexOne;
123             }
124         }
125 
126         w->writeFace(i, Ptex::FaceInfo(res[i], adjfaces[i], adjedges[i]), buff);
127     }
128     free(buff);
129 
130     const char* sval = "a str val";
131     int ndvals = 3;
132     double dvals_buff[3] = { 1.1,2.2,3.3 };
133     double* dvals = dvals_buff;
134     int nivals = 4;
135     int16_t ivals[4] = { 2, 4, 6, 8 };
136     const char* xval = 0;
137 
138     writeMeta(w, sval, dvals, ndvals, ivals, nivals, xval);
139     if (!w->close(error)) {
140         std::cerr << error.c_str() << std::endl;
141         return 1;
142     }
143     w->release();
144     if (!checkMeta("test.ptx", sval, dvals, ndvals, ivals, nivals, xval))
145         return 1;
146 
147     // add some incremental edits
148     w = PtexWriter::edit("test.ptx", true, Ptex::mt_quad, dt, nchan, alpha, nfaces, error);
149     sval = "a string value";
150     dvals[2] = 0;
151     writeMeta(w, sval, dvals, ndvals, 0, 0, 0);
152 
153     if (!w->close(error)) {
154         std::cerr << error.c_str() << std::endl;
155         return 1;
156     }
157     w->release();
158     if (!checkMeta("test.ptx", sval, dvals, ndvals, ivals, nivals, xval))
159         return 1;
160 
161     // add some non-incremental edits, including some large meta data
162     ndvals = 500;
163     dvals = (double*)malloc(ndvals * sizeof(dvals[0]));
164     for (int i = 0; i < ndvals; i++) dvals[i] = i;
165 
166     w = PtexWriter::edit("test.ptx", false, Ptex::mt_quad, dt, nchan, alpha, nfaces, error);
167     xval = "another string value";
168     writeMeta(w, 0, dvals, ndvals, 0, 0, xval);
169     if (!w->close(error)) {
170         std::cerr << error.c_str() << std::endl;
171         return 1;
172     }
173     w->release();
174     if (!checkMeta("test.ptx", sval, dvals, ndvals, ivals, nivals, xval))
175         return 1;
176     free(dvals);
177 
178     return 0;
179 }
180