Beispiel #1
0
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], &center);
  }

  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;
}
Beispiel #3
0
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;
}