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