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)); } }
// 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])); }
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++; } }
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); } }