//----------------------------------------------------------------// bool _vecToXYPlane ( const USVec3D& v0, const USVec3D& v1, USVec2D& result ) { USVec3D vec; vec = v1; vec.Sub ( v0 ); if ( vec.mZ != 0.0f ) { result.mX = vec.mX; result.mY = vec.mY; float t = v0.mZ / -vec.mZ; if (( t > 0.0f ) && ( t <= 1.0f )) { result.Scale ( t ); result.mX += v0.mX; result.mY += v0.mY; return true; } } return false; }
//----------------------------------------------------------------// void MOAIGridDeck2D::DrawIndex ( u32 idx, float xOff, float yOff, float zOff, float xScl, float yScl, float zScl ) { UNUSED ( zScl ); u32 size = this->mBrushes.Size (); if ( !size ) return; if ( !this->mGrid ) return; if ( !this->mDeck ) return; idx = ( idx - 1 ) % size; MOAIGridDeckBrush& brush = this->mBrushes [ idx ]; MOAICellCoord c0 = brush.mMin; MOAICellCoord c1 = brush.mMax; MOAIGrid& grid = *this->mGrid; float tileWidth = grid.GetTileWidth () * xScl; float tileHeight = grid.GetTileHeight () * yScl; xOff = xOff - ( c0.mX * tileWidth ) + brush.mOffset.mX; yOff = yOff - ( c0.mY * tileHeight ) + brush.mOffset.mY; for ( int y = c0.mY; y <= c1.mY; ++y ) { for ( int x = c0.mX; x <= c1.mX; ++x ) { MOAICellCoord wrap = grid.WrapCellCoord ( x, y ); idx = grid.GetTile ( wrap.mX, wrap.mY ); MOAICellCoord coord ( x, y ); USVec2D loc = grid.GetTilePoint ( coord, MOAIGridSpace::TILE_CENTER ); loc.Scale ( xScl, yScl ); this->mDeck->Draw ( idx, this->mRemapper, loc.mX + xOff, loc.mY + yOff, zOff, tileWidth, tileHeight, 1.0f ); } } }
//----------------------------------------------------------------// void MOAIDraw::DrawAxisGrid ( USVec2D loc, USVec2D vec, float size ) { USMatrix4x4 mtx = MOAIGfxDevice::Get ().GetViewProjMtx (); USMatrix4x4 invMtx; invMtx.Inverse ( mtx ); // Set the axis to the grid length so we can get the length back post-transform vec.SetLength ( size ); mtx.Transform ( loc ); mtx.TransformVec ( vec ); // Get the axis unit vector USVec2D norm = vec; size = norm.NormSafe (); // Get the axis normal USVec2D perpNorm ( norm.mY, -norm.mX ); // Project the corners of the viewport onto the axis to get the mix/max bounds float dot; float min; float max; USVec2D corner; // left, top corner.Init ( -1.0f, 1.0f ); corner.Sub ( loc ); dot = norm.Dot ( corner ); min = dot; max = dot; // right, top corner.Init ( 1.0f, 1.0f ); corner.Sub ( loc ); dot = norm.Dot ( corner ); min = ( dot < min ) ? dot : min; max = ( dot > max ) ? dot : max; // right, bottom corner.Init ( 1.0f, -1.0f ); corner.Sub ( loc ); dot = norm.Dot ( corner ); min = ( dot < min ) ? dot : min; max = ( dot > max ) ? dot : max; // left, bottom corner.Init ( -1.0f, -1.0f ); corner.Sub ( loc ); dot = norm.Dot ( corner ); min = ( dot < min ) ? dot : min; max = ( dot > max ) ? dot : max; // Get the start andstop grids s32 start = ( s32 )( min / size ) - 1; s32 stop = ( s32 )( max / size ) + 1; // Set the pen to the first... USVec2D pen = norm; pen.Scale (( float )start * size ); pen.Add ( loc ); // Step along the axis to draw perpendicular grid lines USRect viewRect; viewRect.Init ( -1.0f, -1.0f, 1.0f, 1.0f ); for ( ; start < stop; ++start ) { USVec2D p0; USVec2D p1; if ( viewRect.GetIntersection ( pen, perpNorm, p0, p1 )) { invMtx.Transform ( p0 ); invMtx.Transform ( p1 ); MOAIDraw::DrawLine ( p0, p1 ); } pen.Add ( vec ); } }