00001
00002 #include "MaterialParam.h"
00003
00004
00005 using namespace jbxl;
00006
00007
00009
00010
00011
00012 void TextureParam::init(void)
00013 {
00014 name = init_Buffer();
00015
00016 for (int i=0; i<4; i++) color[i] = 1.0;
00017
00018 alphaChannel = false;
00019 alphaMode = MATERIAL_ALPHA_NONE;
00020 alphaCutoff = 0.0;
00021
00022 shiftU = 0.0;
00023 shiftV = 0.0;
00024 scaleU = 1.0;
00025 scaleV = 1.0;
00026 rotate = 0.0;
00027
00028 flipU = false;
00029 flipV = false;
00030
00031 return;
00032 }
00033
00034
00035
00036 void TextureParam::free (void)
00037 {
00038 free_Buffer(&name);
00039
00040 return;
00041 }
00042
00043
00044
00045 void TextureParam::dup(TextureParam t)
00046 {
00047 *this = t;
00048
00049 name = dup_Buffer(t.name);
00050 }
00051
00052
00053
00054 void TextureParam::execShift(UVMap<double>* uv, int num)
00055 {
00056 for (int i=0; i<num; i++) {
00057 uv[i].u += shiftU;
00058 uv[i].v += shiftV;
00059 }
00060 }
00061
00062
00063
00064 void TextureParam::execInvShift(UVMap<double>* uv, int num)
00065 {
00066 for (int i=0; i<num; i++) {
00067 uv[i].u -= shiftU;
00068 uv[i].v -= shiftV;
00069 }
00070 }
00071
00072
00073
00074 void TextureParam::execScale(UVMap<double>* uv, int num)
00075 {
00076 double uu, vv;
00077
00078 for (int i=0; i<num; i++) {
00079 uu = (uv[i].u - 0.5)*scaleU;
00080 vv = (uv[i].v - 0.5)*scaleV;
00081 uv[i].u = uu + 0.5;
00082 uv[i].v = vv + 0.5;
00083 }
00084 }
00085
00086
00087
00088 void TextureParam::execInvScale(UVMap<double>* uv, int num)
00089 {
00090 double uu, vv;
00091
00092 for (int i=0; i<num; i++) {
00093 uu = (uv[i].u - 0.5)/scaleU;
00094 vv = (uv[i].v - 0.5)/scaleV;
00095 uv[i].u = uu + 0.5;
00096 uv[i].v = vv + 0.5;
00097 }
00098 }
00099
00100
00101
00102 void TextureParam::execRotate(UVMap<double>* uv, int num)
00103 {
00104 double uu, vv;
00105 double cs = cos(rotate);
00106 double sn = sin(rotate);
00107
00108 for (int i=0; i<num; i++) {
00109 uu = uv[i].u - 0.5;
00110 vv = uv[i].v - 0.5;
00111 uv[i].u = uu*cs + vv*sn + 0.5;
00112 uv[i].v = -uu*sn + vv*cs + 0.5;
00113 }
00114 }
00115
00116
00117
00118 void TextureParam::execInvRotate(UVMap<double>* uv, int num)
00119 {
00120 double uu, vv;
00121 double cs = cos(rotate);
00122 double sn = -sin(rotate);
00123
00124 for (int i=0; i<num; i++) {
00125 uu = uv[i].u - 0.5;
00126 vv = uv[i].v - 0.5;
00127 uv[i].u = uu*cs + vv*sn + 0.5;
00128 uv[i].v = -uu*sn + vv*cs + 0.5;
00129 }
00130 }
00131
00132
00133
00134 void TextureParam::execTrans(UVMap<double>* uv, int num)
00135 {
00136
00137 if (flipU) { execFlipU(uv, num); flipU = false;}
00138 if (flipV) { execFlipV(uv, num); flipV = false;}
00139 if (isSetRotate()) execRotate(uv, num);
00140 if (isSetScale()) execScale (uv, num);
00141 if (isSetShift()) execShift (uv, num);
00142
00143 return;
00144 }
00145
00146
00147
00148 void TextureParam::execInvTrans(UVMap<double>* uv, int num)
00149 {
00150 if (flipU) { execFlipU(uv, num); flipU = false;}
00151 if (flipV) { execFlipV(uv, num); flipV = false;}
00152 if (isSetShift()) execInvShift (uv, num);
00153 if (isSetScale()) execInvScale (uv, num);
00154 if (isSetRotate()) execInvRotate(uv, num);
00155
00156 return;
00157 }
00158
00159
00160
00161 void TextureParam::printParam(FILE* fp)
00162 {
00163 fprintf(fp, "TextureParam.name = %s\n", name.buf);
00164 fprintf(fp, "TextureParam.color = (%f,%f,%f,%f) [RGBA]\n", color[0], color[1], color[2], color[3]);
00165 fprintf(fp, "TextureParam.shiftU = %f\n", shiftU);
00166 fprintf(fp, "TextureParam.shiftV = %f\n", shiftV);
00167 fprintf(fp, "TextureParam.scaleU = %f\n", scaleU);
00168 fprintf(fp, "TextureParam.scaleV = %f\n", scaleV);
00169 fprintf(fp, "TextureParam.rotate = %f\n", rotate);
00170
00171 if (alphaChannel) fprintf(fp, "TextureParam.alphaChannel = true\n");
00172 else fprintf(fp, "TextureParam.alphaChannel = flase\n");
00173
00174 if (flipU) fprintf(fp, "TextureParam.flipU = true\n");
00175 else fprintf(fp, "TextureParam.flipU = false\n");
00176 if (flipV) fprintf(fp, "TextureParam.flipV = true\n");
00177 else fprintf(fp, "TextureParam.flipV = false\n");
00178
00179 fflush(fp);
00180 return;
00181 }
00182
00183
00184
00185
00187
00192 bool jbxl::isSameTexture(TextureParam a, TextureParam b)
00193 {
00194 char* a_name = a.getName();
00195 char* b_name = b.getName();
00196 if (a_name!=NULL && b_name!=NULL) {
00197 if (strcmp(a_name, b_name)) return false;
00198 }
00199 else if (a_name!=NULL || b_name!=NULL) return false;
00200
00201
00202 for (int i=0; i<4; i++) {
00203 if (a.getColor(i)!=b.getColor(i)) return false;
00204 }
00205
00206 return true;
00207 }
00208
00209
00210
00211
00213
00214
00215
00216 void MaterialParam::init(void)
00217 {
00218 enable = false;
00219
00220 texture.init();
00221 bumpmap.init();
00222 specmap.init();
00223
00224 addname = init_Buffer();
00225
00226 transparent = 1.0;
00227 shininess = 0.0;
00228 glow = 0.0;
00229 bright = 0.0;
00230 glossiness = 0.0;
00231 environment = 0.0;
00232 light = 0.0;
00233
00234 mapping = 0;
00235 mflags = 0;
00236 others = 0;
00237
00238 return;
00239 }
00240
00241
00242
00243 void MaterialParam::free (void)
00244 {
00245 texture.free();
00246 bumpmap.free();
00247 specmap.free();
00248
00249 free_Buffer(&addname);
00250
00251 return;
00252 }
00253
00254
00255
00256 void MaterialParam::dup(MaterialParam m)
00257 {
00258 *this = m;
00259
00260 texture.dup(m.texture);
00261 bumpmap.dup(m.bumpmap);
00262 specmap.dup(m.specmap);
00263
00264 addname = dup_Buffer(m.addname);
00265 }
00266
00267
00268
00272 void MaterialParam::setupFullName(const char* ext)
00273 {
00274 if (texture.isSetTexture()) {
00275 if (addname.buf!=NULL) {
00276 texture.addName("_");
00277 texture.addName((char*)addname.buf);
00278 }
00279 if (ext!=NULL) {
00280 if (ext[0]!='.') texture.addName(".");
00281 texture.addName(ext);
00282 }
00283 }
00284 if (bumpmap.isSetTexture()) {
00285 if (addname.buf!=NULL) {
00286 bumpmap.addName("_");
00287 bumpmap.addName((char*)addname.buf);
00288 }
00289 if (ext!=NULL) {
00290 if (ext[0]!='.') bumpmap.addName(".");
00291 bumpmap.addName(ext);
00292 }
00293 }
00294 if (specmap.isSetTexture()) {
00295 if (addname.buf!=NULL) {
00296 specmap.addName("_");
00297 specmap.addName((char*)addname.buf);
00298 }
00299 if (ext!=NULL) {
00300 if (ext[0]!='.') specmap.addName(".");
00301 specmap.addName(ext);
00302 }
00303 }
00304 }
00305
00306
00307
00308 void MaterialParam::printParam(FILE* fp)
00309 {
00310 if (!enable) {
00311 fprintf(fp, "MaterialParam is disable\n");
00312 return;
00313 }
00314
00315 texture.printParam(fp);
00316 if (bumpmap.isSetTexture()) bumpmap.printParam(fp);
00317 if (specmap.isSetTexture()) specmap.printParam(fp);
00318
00319 fprintf(fp, "MaterialParam.addname = %s\n", addname.buf);
00320 fprintf(fp, "MaterialParam.transparent = %f\n", transparent);
00321 fprintf(fp, "MaterialParam.shininess = %f\n", shininess);
00322 fprintf(fp, "MaterialParam.glow = %f\n", glow);
00323 fprintf(fp, "MaterialParam.bright = %f\n", bright);
00324 fprintf(fp, "MaterialParam.mapping = %d\n", mapping);
00325 fprintf(fp, "MaterialParam.mflags = %d\n", mflags);
00326 fprintf(fp, "MaterialParam.others = %d\n", others);
00327
00328 fprintf(fp, "MaterialParam.glossiness = %f\n", glossiness);
00329 fprintf(fp, "MaterialParam.environment = %f\n", environment);
00330
00331 fflush(fp);
00332 return;
00333 }
00334
00335
00336
00344 char* MaterialParam::getBase64Params(char obj)
00345 {
00346 uByte attr[MATERIAL_ATTR_LEN];
00347
00348 double red = getColor(0);
00349 double green = getColor(1);
00350 double blue = getColor(2);
00351 double alpha = getColor(3);
00352 double cutoff = getAlphaCutoff();
00353 int almode = getAlphaMode();
00354
00355 double transp = transparent;
00356
00357 short int rotate = (short int)((int)(getRotate()*2000.)%32768);
00358 short int shiftu = (short int)((int)(getShiftU()*2000.)%32768);
00359 short int shiftv = (short int)((int)(getShiftV()*2000.)%32768);
00360 short int scaleu = (short int)((int)(getScaleU()*100. )%32768);
00361 short int scalev = (short int)((int)(getScaleV()*100. )%32768);
00362
00363 if (alpha<0.99) {
00364 almode = MATERIAL_ALPHA_BLENDING;
00365 cutoff = 0.0;
00366 transp = alpha;
00367 }
00368
00369 if (cutoff==0.0 && almode==MATERIAL_ALPHA_MASKING) transp = 1.0;
00370 if (cutoff>0.9) cutoff = 0.9;
00371
00372 memset(attr, 0, MATERIAL_ATTR_LEN);
00373 attr[MATERIAL_ATTR_COLOR_RED] = (uByte)((1.0-red)*255);
00374 attr[MATERIAL_ATTR_COLOR_GREEN] = (uByte)((1.0-green)*255);
00375 attr[MATERIAL_ATTR_COLOR_BLUE] = (uByte)((1.0-blue)*255);
00376 attr[MATERIAL_ATTR_TRANSPARENT] = (uByte)((1.0-transp)*255);
00377 attr[MATERIAL_ATTR_ALPHACUTOFF] = (uByte)(cutoff*255);
00378 attr[MATERIAL_ATTR_SHININESS] = (uByte)(shininess*255);
00379 attr[MATERIAL_ATTR_GLOW] = (uByte)(glow*255);
00380 attr[MATERIAL_ATTR_BRIGHT] = (uByte)(bright*255);
00381 attr[MATERIAL_ATTR_LIGHT] = (uByte)(light*255);
00382 attr[MATERIAL_ATTR_OBJECT] = (uByte)obj;
00383
00384 memcpy(attr+MATERIAL_ATTR_SHIFT_U, &shiftu, 2);
00385 memcpy(attr+MATERIAL_ATTR_SHIFT_V, &shiftv, 2);
00386 memcpy(attr+MATERIAL_ATTR_SCALE_U, &scaleu, 2);
00387 memcpy(attr+MATERIAL_ATTR_SCALE_V, &scalev, 2);
00388 memcpy(attr+MATERIAL_ATTR_ROTATE, &rotate, 2);
00389
00390 char* params = (char*)encode_base64_filename(attr, MATERIAL_ATTR_LEN);
00391
00392 return params;
00393 }
00394
00395
00396
00397
00399
00404 bool jbxl::isSameMaterial(MaterialParam a, MaterialParam b)
00405 {
00406 if (!isSameTexture(a.texture, b.texture)) return false;
00407 if (!isSameTexture(a.bumpmap, b.bumpmap)) return false;
00408 if (!isSameTexture(a.specmap, b.specmap)) return false;
00409
00410
00411 bool ret = true;
00412
00413 char* a_param = a.getBase64Params();
00414 char* b_param = b.getBase64Params();
00415
00416 if (a_param!=NULL && b_param!=NULL) {
00417 if (strcmp(a_param, b_param)) ret = false;
00418 }
00419 else if (a_param!=NULL || b_param!=NULL) {
00420 ret = false;
00421 }
00422 if (a_param!=NULL) ::free(a_param);
00423 if (b_param!=NULL) ::free(b_param);
00424
00425 return ret;
00426 }
00427
00428
00429