static void Init() { canvas = NewPixBuf(PIXBUF_CLUT, WIDTH, HEIGHT); map[0] = NewPixBuf(PIXBUF_GRAY, WIDTH, HEIGHT); map[1] = NewPixBuf(PIXBUF_GRAY, WIDTH, HEIGHT); shade = NewPixBuf(PIXBUF_GRAY, WIDTH, HEIGHT); { FLineT line; FPointT pa = { 0, 0 }; FPointT pb = { WIDTH, HEIGHT }; FLineInitFromPoints(&line, &pa, &pb); LinearGradient(map[0], &line); } { FPointT center = { WIDTH / 2, HEIGHT / 2 }; CircularGradient(map[1], ¢er); } InitDisplay(WIDTH, HEIGHT, DEPTH); LoadPalette(imagePal); }
END_TEST START_TEST ( test_LinearGradient_read ) { std::string s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" "<linearGradient id=\"gradient\">\n" " <stop offset=\"20%\" stop-color=\"#FF0000\"/>\n" " <stop offset=\"80%\" stop-color=\"#0000FF\"/>\n" "</linearGradient>\n" ; XMLInputStream* pStream= new XMLInputStream(s.c_str(),false); XMLNode* pNode = new XMLNode(*pStream); // required attributes LinearGradient l(*pNode); fail_unless(l.isSetId()); fail_unless(l.getId() == "gradient"); fail_unless(l.getSpreadMethod() == GradientBase::PAD); fail_unless(l.getNumGradientStops() == 2); fail_unless(l.getGradientStop(0)->getOffset().getAbsoluteValue() < 1e-9); fail_unless(fabs((l.getGradientStop(0)->getOffset().getRelativeValue() - 20.0) / 20.0) < 1e-9); fail_unless(l.getGradientStop(0)->getStopColor() == "#FF0000"); fail_unless(l.getGradientStop(1)->getOffset().getAbsoluteValue() < 1e-9); fail_unless(fabs((l.getGradientStop(1)->getOffset().getRelativeValue() - 80.0) / 80.0) < 1e-9); fail_unless(l.getGradientStop(1)->getStopColor() == "#0000FF"); // linear gradient attributes fail_unless(l.getXPoint1().getAbsoluteValue() < 1e-9); fail_unless(l.getXPoint1().getRelativeValue() < 1e-9); fail_unless(l.getYPoint1().getAbsoluteValue() < 1e-9); fail_unless(l.getYPoint1().getRelativeValue() < 1e-9); fail_unless(l.getZPoint1().getAbsoluteValue() < 1e-9); fail_unless(l.getZPoint1().getRelativeValue() < 1e-9); fail_unless(l.getXPoint2().getAbsoluteValue() < 1e-9); fail_unless(fabs((l.getXPoint2().getRelativeValue() - 100.0) / 100.0) < 1e-9); fail_unless(l.getYPoint2().getAbsoluteValue() < 1e-9); fail_unless(fabs((l.getYPoint2().getRelativeValue() - 100.0) / 100.0) < 1e-9); fail_unless(l.getZPoint2().getAbsoluteValue() < 1e-9); fail_unless(fabs((l.getZPoint2().getRelativeValue() - 100.0) / 100.0) < 1e-9); delete pNode; delete pStream; s = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" "<linearGradient id=\"gradient\" spreadMethod=\"reflect\"\n" " x1=\"3.0\" y1=\"4.0\" z1=\"5.0\"\n" " x2=\"6.0\" y2=\"7.0\" z2=\"8.0\">\n" " <stop offset=\"20%\" stop-color=\"#FF0000\"/>\n" " <stop offset=\"80%\" stop-color=\"#0000FF\"/>\n" "</linearGradient>\n" ; pStream= new XMLInputStream(s.c_str(),false); pNode = new XMLNode(*pStream); // optional attributes l = LinearGradient(*pNode); fail_unless(l.isSetId()); fail_unless(l.getId() == "gradient"); fail_unless(l.getSpreadMethod() == GradientBase::REFLECT); fail_unless(l.getNumGradientStops() == 2); fail_unless(l.getGradientStop(0)->getOffset().getAbsoluteValue() < 1e-9); fail_unless(fabs((l.getGradientStop(0)->getOffset().getRelativeValue() - 20.0) / 20.0) < 1e-9); fail_unless(l.getGradientStop(0)->getStopColor() == "#FF0000"); fail_unless(l.getGradientStop(1)->getOffset().getAbsoluteValue() < 1e-9); fail_unless(fabs((l.getGradientStop(1)->getOffset().getRelativeValue() - 80.0) / 80.0) < 1e-9); fail_unless(l.getGradientStop(1)->getStopColor() == "#0000FF"); // linear gradient attributes fail_unless(fabs((l.getXPoint1().getAbsoluteValue() - 3.0) / 3.0) < 1e-9); fail_unless(l.getXPoint1().getRelativeValue() < 1e-9); fail_unless(fabs((l.getYPoint1().getAbsoluteValue() - 4.0) / 4.0) < 1e-9); fail_unless(l.getYPoint1().getRelativeValue() < 1e-9); fail_unless(fabs((l.getZPoint1().getAbsoluteValue() - 5.0) / 5.0) < 1e-9); fail_unless(l.getZPoint1().getRelativeValue() < 1e-9); fail_unless(fabs((l.getXPoint2().getAbsoluteValue() - 6.0) / 6.0) < 1e-9); fail_unless(l.getXPoint2().getRelativeValue() < 1e-9); fail_unless(fabs((l.getYPoint2().getAbsoluteValue() - 7.0) / 7.0) < 1e-9); fail_unless(l.getYPoint2().getRelativeValue() < 1e-9); fail_unless(fabs((l.getZPoint2().getAbsoluteValue() - 8.0) / 8.0) < 1e-9); fail_unless(l.getZPoint2().getRelativeValue() < 1e-9); delete pNode; delete pStream; }
int main(int argc,char **argv) { // initialize generator InitTexgen(); // colors Pixel black,white; black.Init(0,0,0,255); white.Init(255,255,255,255); timeBeginPeriod(1); sInt startTime = timeGetTime(); for(sInt i=0;i<100;i++) { // create gradients GenTexture gradBW = LinearGradient(0xff000000,0xffffffff); GenTexture gradWB = LinearGradient(0xffffffff,0xff000000); GenTexture gradWhite = LinearGradient(0xffffffff,0xffffffff); // simple noise test texture GenTexture noise; noise.Init(256,256); noise.Noise(gradBW,2,2,6,0.5f,123,GenTexture::NoiseDirect|GenTexture::NoiseBandlimit|GenTexture::NoiseNormalize); /*// save test image if(!SaveImage(noise,"noise.tga")) { printf("Couldn't write 'noise.tga'!\n"); return 1; }*/ // 4 "random voronoi" textures with different minimum distances GenTexture voro[4]; static sInt voroIntens[4] = { 37, 42, 37, 37 }; static sInt voroCount[4] = { 90, 132, 240, 255 }; static sF32 voroDist[4] = { 0.125f, 0.063f, 0.063f, 0.063f }; for(sInt i=0;i<4;i++) { voro[i].Init(256,256); RandomVoronoi(voro[i],gradWhite,voroIntens[i],voroCount[i],voroDist[i]); } // linear combination of them LinearInput inputs[4]; for(sInt i=0;i<4;i++) { inputs[i].Tex = &voro[i]; inputs[i].Weight = 1.5f; inputs[i].UShift = 0.0f; inputs[i].VShift = 0.0f; inputs[i].FilterMode = GenTexture::WrapU|GenTexture::WrapV|GenTexture::FilterNearest; } GenTexture baseTex; baseTex.Init(256,256); baseTex.LinearCombine(black,0.0f,inputs,4); // blur it baseTex.Blur(baseTex,0.0074f,0.0074f,1,GenTexture::WrapU|GenTexture::WrapV); // add a noise layer GenTexture noiseLayer; noiseLayer.Init(256,256); noiseLayer.Noise(LinearGradient(0xff000000,0xff646464),4,4,5,0.995f,3,GenTexture::NoiseDirect|GenTexture::NoiseNormalize|GenTexture::NoiseBandlimit); baseTex.Paste(baseTex,noiseLayer,0.0f,0.0f,1.0f,0.0f,0.0f,1.0f,GenTexture::CombineAdd,0); // colorize it Colorize(baseTex,0xff747d8e,0xfff1feff); // Create transform matrix for grid pattern Matrix44 m1,m2,m3; MatTranslate(m1,-0.5f,-0.5f,0.0f); MatScale(m2,3.0f * sSQRT2F,3.0f * sSQRT2F,1.0f); MatMult(m3,m2,m1); MatRotateZ(m1,0.125f * sPI2F); MatMult(m2,m1,m3); MatTranslate(m1,0.5f,0.5f,0.0f); MatMult(m3,m1,m2); // Grid pattern GlowRect GenTexture rect1,rect1x,rect1n; rect1.Init(256,256); rect1.LinearCombine(black,1.0f,0,0); // black background rect1.GlowRect(rect1,gradWB,0.5f,0.5f,0.41f,0.0f,0.0f,0.25f,0.7805f,0.64f); rect1x.Init(256,256); rect1x.CoordMatrixTransform(rect1,m3,GenTexture::WrapU|GenTexture::WrapV|GenTexture::FilterBilinear); // Make a normalmap from it rect1n.Init(256,256); rect1n.Derive(rect1x,GenTexture::DeriveNormals,2.5f); // Apply as bump map GenTexture finalTex; Pixel amb,diff; finalTex.Init(256,256); amb.Init(0xff101010); diff.Init(0xffffffff); finalTex.Bump(baseTex,rect1n,0,0,0.0f,0.0f,0.0f,-2.518f,0.719f,-3.10f,amb,diff,sTRUE); // Second grid pattern GlowRect GenTexture rect2,rect2x; rect2.Init(256,256); rect2.LinearCombine(white,1.0f,0,0); // white background rect2.GlowRect(rect2,gradBW,0.5f,0.5f,0.36f,0.0f,0.0f,0.20f,0.8805f,0.74f); rect2x.Init(256,256); rect2x.CoordMatrixTransform(rect2,m3,GenTexture::WrapU|GenTexture::WrapV|GenTexture::FilterBilinear); // Multiply it over finalTex.Paste(finalTex,rect2x,0.0f,0.0f,1.0f,0.0f,0.0f,1.0f,GenTexture::CombineMultiply,0); } sInt totalTime = timeGetTime() - startTime; timeEndPeriod(1); printf("%d ms/tex\n",totalTime / 100); /*SaveImage(baseTex,"baseTex.tga"); SaveImage(finalTex,"final.tga");*/ return 0; }