Exemplo n.º 1
0
void PlaneRake::GenSeedRandom(const size_t numSeeds[3], 
			      const float min[3], 
			      const float max[3], 
			      VECTOR3* pSeed)
{
	int totalNum;
	// eight corners
	float ll[3], hl[3], hh[3], lh[3];
	int iFor;

	for(iFor = 0; iFor < 3; iFor++)
	{
		ll[iFor] = min[iFor];
		hh[iFor] = max[iFor];
	}

	hl[0] = hh[0];	hl[1] = ll[1];	hl[2] = ll[2];
	lh[0] = ll[0];	lh[1] = hh[1];	lh[2] = hh[2];

	// initialize random number generator
	srand((unsigned)time(NULL));

	totalNum = numSeeds[0] * numSeeds[1] * numSeeds[2];
	for(iFor = 0; iFor < totalNum; iFor++)
	{
		float coeff[2];
		coeff[0] = (float)rand()/(float)RAND_MAX;
		coeff[1] = (float)rand()/(float)RAND_MAX;
		
		pSeed[iFor].Set(BiLerp(ll[0], hl[0], lh[0], hh[0], coeff),
						BiLerp(ll[1], hl[1], lh[1], hh[1], coeff),
						BiLerp(ll[2], hl[2], lh[2], hh[2], coeff));
	}
}
Exemplo n.º 2
0
// trilinear interpolation
float TriLerp(float lll, float hll, float lhl, float hhl,
			  float llh, float hlh, float lhh, float hhh,
			  float coeff[3])
{
	float temp1, temp2;
	float factor[2];

	factor[0] = coeff[0]; 
	factor[1] = coeff[1];

	temp1 = BiLerp(lll, hll, lhl, hhl, factor);
	temp2 = BiLerp(llh, hlh, lhh, hhh, factor);
	return (Lerp(temp1, temp2, coeff[2]));
}
Exemplo n.º 3
0
void PlaneRake::GenSeedRegular(const size_t numSeeds[3], 
			       const float min[3], 
			       const float max[3], 
			       VECTOR3* pSeed)
{
	// eight corners
	float ll[3], hl[3], hh[3], lh[3];
	int iFor, jFor;
	for(iFor = 0; iFor < 3; iFor++)
	{
		ll[iFor] = min[iFor];
		hh[iFor] = max[iFor];
	}
	hl[0] = hh[0];	hl[1] = ll[1];	hl[2] = ll[2];
	lh[0] = ll[0];	lh[1] = hh[1];	lh[2] = hh[2];

	// generate seeds
	float widthUnit, heightUnit;
	int numPerRow, numPerCol;
	if(numSeeds[0] != 1)
		numPerRow = numSeeds[0];
	else if(numSeeds[1] != 1)
		numPerRow = numSeeds[1];

	if(numSeeds[1] != 1)
		numPerCol = numSeeds[1];
	else if(numSeeds[2] != 1)
		numPerCol = numSeeds[2];

	widthUnit = (float)1.0/float(numPerRow+1);
	heightUnit = (float)1.0/float(numPerCol+1);
	int index = 0;
	for(jFor = 0; jFor < numPerCol; jFor++)
		for(iFor = 0; iFor < numPerRow; iFor++)
		{
			float coeff[2];
			coeff[0] = (float)(iFor+1) * widthUnit;
			coeff[1] = (float)(jFor+1) * heightUnit;

			pSeed[index].Set(BiLerp(ll[0], hl[0], lh[0], hh[0], coeff),
							 BiLerp(ll[1], hl[1], lh[1], hh[1], coeff),
							 BiLerp(ll[2], hl[2], lh[2], hh[2], coeff));
			index++;
		}
}
Exemplo n.º 4
0
void BlittingHelpers::StretchBlitBitmap(const VisBitmap_cl *pSrcBitmap, const hkvVec2 pSrcVertexCoords[4], BitmapInfo_t &targetInfo, int iX, int iY, int iSizeX, int iSizeY, const hkvVec4& auxColor, PixelCombineCallback combine, VColorComponentBits eWriteMask)
{
  if (pSrcVertexCoords==NULL)
  {
    StretchBlitBitmap(pSrcBitmap, targetInfo, iX,iY,iSizeX,iSizeY,auxColor,combine,eWriteMask);
    return;
  }
  // adjust to target size
  if (iSizeX<0) iSizeX = targetInfo.m_iSize[0];
  if (iSizeY<0) iSizeY = targetInfo.m_iSize[1];

  // clip rectangle
  int iOfsX,iOfsY;
  int iRect[4] = {iX,iY,iX+iSizeX-1,iY+iSizeY-1};
  if (iSizeX<1 || iSizeY<1 || !targetInfo.ScissorRect(iRect,iOfsX,iOfsY))
    return;

  if (iX>0) iOfsX-=iX;
  if (iY>0) iOfsY-=iY;
  hkvVec4 vSrcColor;
  const float fScaleU = 1.f/(float)iSizeX;
  const float fScaleV = 1.f/(float)iSizeY;
  const float fScale = 1.f/255.f;

  hkvVec2 coord;
  for (int y=iRect[1];y<=iRect[3];y++)
    for (int x=iRect[0];x<=iRect[2];x++)
    {
      coord.x = ((float)(x+iOfsX)+0.5f)*fScaleU;
      coord.y = ((float)(y+iOfsY)+0.5f)*fScaleV;
      // lerp coordinates:
      coord = BiLerp(pSrcVertexCoords,coord);
      if (coord.x<0.f || coord.y<0.f || coord.x>=1.0f || coord.y>=1.0f)
        continue;

      ((VisBitmap_cl *)pSrcBitmap)->LookupTexelColor(vSrcColor, coord.x,coord.y);
      vSrcColor.r *= fScale;
      vSrcColor.g *= fScale;
      vSrcColor.b *= fScale;
      vSrcColor.a *= fScale;
      hkvVec4 vDstColor = targetInfo.GetColorAt(x,y);

      hkvVec4 result = combine(vSrcColor,vDstColor,auxColor);
      if (eWriteMask&Red)   vDstColor.r = result.r;
      if (eWriteMask&Green) vDstColor.g = result.g;
      if (eWriteMask&Blue)  vDstColor.b = result.b;
      if (eWriteMask&Alpha) vDstColor.a = result.a;
      targetInfo.SetColorAt(x,y,vDstColor);
    }
}