Int32 Atlas1D_UsedAtlasesCount(void) { TextureLoc maxTexLoc = 0; Int32 i; for (i = 0; i < Array_Elems(Block_Textures); i++) { maxTexLoc = max(maxTexLoc, Block_Textures[i]); } return Atlas1D_Index(maxTexLoc) + 1; }
/* Index of maximum used 1D atlas + 1 */ CC_NOINLINE static int MapRenderer_UsedAtlases(void) { TextureLoc maxLoc = 0; int i; for (i = 0; i < Array_Elems(Blocks.Textures); i++) { maxLoc = max(maxLoc, Blocks.Textures[i]); } return Atlas1D_Index(maxLoc) + 1; }
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; }
static void Terrain_Update1DCounts(void) { Int32 i; for (i = 0; i < Atlas1D_Count; i++) { Terrain_1DCount[i] = 0; Terrain_1DIndices[i] = 0; } for (i = 0; i < Terrain_Count; i++) { Int32 index = Atlas1D_Index(Terrain_Particles[i].TexLoc); Terrain_1DCount[index] += 4; } for (i = 1; i < Atlas1D_Count; i++) { Terrain_1DIndices[i] = Terrain_1DIndices[i - 1] + Terrain_1DCount[i - 1]; } }
static void Terrain_Render(Real32 t) { if (Terrain_Count == 0) return; VertexP3fT2fC4b vertices[PARTICLES_MAX * 4]; Terrain_Update1DCounts(); Int32 i; for (i = 0; i < Terrain_Count; i++) { Int32 index = Atlas1D_Index(Terrain_Particles[i].TexLoc); VertexP3fT2fC4b* ptr = &vertices[Terrain_1DIndices[index]]; TerrainParticle_Render(&Terrain_Particles[i], t, ptr); Terrain_1DIndices[index] += 4; } Gfx_SetDynamicVbData(Particles_VB, vertices, Terrain_Count * 4); Int32 offset = 0; for (i = 0; i < Atlas1D_Count; i++) { UInt16 partCount = Terrain_1DCount[i]; if (partCount == 0) continue; Gfx_BindTexture(Atlas1D_TexIds[i]); Gfx_DrawVb_IndexedTris_Range(partCount, offset); offset += partCount; } }
static void Builder_AddVertices(BlockID block, Face face) { Int32 baseOffset = (Block_Draw[block] == DRAW_TRANSLUCENT) * ATLAS1D_MAX_ATLASES; Int32 i = Atlas1D_Index(Block_GetTexLoc(block, face)); Builder1DPart* part = &Builder_Parts[baseOffset + i]; part->fCount[face] += 4; }
static void Builder_AddSpriteVertices(BlockID block) { Int32 i = Atlas1D_Index(Block_GetTexLoc(block, FACE_XMIN)); Builder1DPart* part = &Builder_Parts[i]; part->sCount += 4 * 4; }
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; }