TextureRec Atlas1D_TexRec(TextureLoc texLoc, Int32 uCount, Int32* index) { *index = Atlas1D_Index(texLoc); Int32 y = Atlas1D_RowId(texLoc); /* Adjust coords to be slightly inside - fixes issues with AMD/ATI cards. */ TextureRec rec; rec.U1 = 0.0f; rec.V1 = y * Atlas1D_InvTileSize; rec.U2 = (uCount - 1) + UV2_Scale; rec.V2 = rec.V1 + UV2_Scale * Atlas1D_InvTileSize; return rec; }
void Drawer_YMin(int count, PackedCol col, TextureLoc texLoc, VertexP3fT2fC4b** vertices) { VertexP3fT2fC4b* ptr = *vertices; VertexP3fT2fC4b v; float vOrigin = Atlas1D_RowId(texLoc) * Atlas1D.InvTileSize; float u1 = Drawer.MinBB.X; float u2 = (count - 1) + Drawer.MaxBB.X * UV2_Scale; float v1 = vOrigin + Drawer.MinBB.Z * Atlas1D.InvTileSize; float v2 = vOrigin + Drawer.MaxBB.Z * Atlas1D.InvTileSize * UV2_Scale; ApplyTint; v.Y = Drawer.Y1; v.Col = col; v.X = Drawer.X2 + (count - 1); v.Z = Drawer.Z2; v.U = u2; v.V = v2; *ptr++ = v; v.X = Drawer.X1; v.U = u1; *ptr++ = v; v.Z = Drawer.Z1; v.V = v1; *ptr++ = v; v.X = Drawer.X2 + (count - 1); v.U = u2; *ptr++ = v; *vertices = ptr; }
static void Builder_DrawSprite(Int32 count) { TextureLoc texLoc = Block_GetTexLoc(Builder_Block, FACE_XMAX); Int32 i = Atlas1D_Index(texLoc); Real32 vOrigin = Atlas1D_RowId(texLoc) * Atlas1D_InvTileSize; Real32 X = (Real32)Builder_X, Y = (Real32)Builder_Y, Z = (Real32)Builder_Z; #define u1 0.0f #define u2 UV2_Scale Real32 x1 = (Real32)X + 2.50f / 16.0f, y1 = (Real32)Y, z1 = (Real32)Z + 2.50f / 16.0f; Real32 x2 = (Real32)X + 13.5f / 16.0f, y2 = (Real32)Y + 1.0f, z2 = (Real32)Z + 13.5f / 16.0f; Real32 v1 = vOrigin, v2 = vOrigin + Atlas1D_InvTileSize * UV2_Scale; UInt8 offsetType = Block_SpriteOffset[Builder_Block]; if (offsetType >= 6 && offsetType <= 7) { Random_SetSeed(&spriteRng, (Builder_X + 1217 * Builder_Z) & 0x7fffffff); Real32 valX = Random_Range(&spriteRng, -3, 3 + 1) / 16.0f; Real32 valY = Random_Range(&spriteRng, 0, 3 + 1) / 16.0f; Real32 valZ = Random_Range(&spriteRng, -3, 3 + 1) / 16.0f; #define stretch 1.7f / 16.0f x1 += valX - stretch; x2 += valX + stretch; z1 += valZ - stretch; z2 += valZ + stretch; if (offsetType == 7) { y1 -= valY; y2 -= valY; } } Builder1DPart* part = &Builder_Parts[i]; PackedCol white = PACKEDCOL_WHITE; PackedCol col = Builder_FullBright ? white : Lighting_Col_Sprite_Fast(Builder_X, Builder_Y, Builder_Z); Block_Tint(col, Builder_Block); VertexP3fT2fC4b v; v.Col = col; /* Draw Z axis */ Int32 index = part->sOffset; v.X = x1; v.Y = y1; v.Z = z1; v.U = u2; v.V = v2; Builder_Vertices[index + 0] = v; v.Y = y2; v.V = v1; Builder_Vertices[index + 1] = v; v.X = x2; v.Z = z2; v.U = u1; Builder_Vertices[index + 2] = v; v.Y = y1; v.V = v2; Builder_Vertices[index + 3] = v; /* Draw Z axis mirrored */ index += part->sAdvance; v.X = x2; v.Y = y1; v.Z = z2; v.U = u2; Builder_Vertices[index + 0] = v; v.Y = y2; v.V = v1; Builder_Vertices[index + 1] = v; v.X = x1; v.Z = z1; v.U = u1; Builder_Vertices[index + 2] = v; v.Y = y1; v.V = v2; Builder_Vertices[index + 3] = v; /* Draw X axis */ index += part->sAdvance; v.X = x1; v.Y = y1; v.Z = z2; v.U = u2; Builder_Vertices[index + 0] = v; v.Y = y2; v.V = v1; Builder_Vertices[index + 1] = v; v.X = x2; v.Z = z1; v.U = u1; Builder_Vertices[index + 2] = v; v.Y = y1; v.V = v2; Builder_Vertices[index + 3] = v; /* Draw X axis mirrored */ index += part->sAdvance; v.X = x2; v.Y = y1; v.Z = z1; v.U = u2; Builder_Vertices[index + 0] = v; v.Y = y2; v.V = v1; Builder_Vertices[index + 1] = v; v.X = x1; v.Z = z2; v.U = u1; Builder_Vertices[index + 2] = v; v.Y = y1; v.V = v2; Builder_Vertices[index + 3] = v; part->sOffset += 4; }