22 #include "precompiled.h"
98 GL_TEXTURE_CUBE_MAP_POSITIVE_X,
99 GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
100 GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
101 GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
102 GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
103 GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
121 if (
g_VFS->LoadFile(path, file, fileSize) < 0)
124 if (
g_VFS->LoadFile(path2, file, fileSize) < 0)
127 LOGERROR(L
"Error creating sky cubemap.");
139 if (types[i] == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y || types[i] == GL_TEXTURE_CUBE_MAP_POSITIVE_Y)
141 std::vector<u8> rotated(tex.
dataSize);
143 for (
size_t y = 0; y < tex.
h; ++y)
145 for (
size_t x = 0; x < tex.
w; ++x)
147 size_t invx = y, invy = tex.
w-x-1;
149 rotated[(y*tex.
w + x) * 4 + 0] = data[(invy*tex.
w + invx) * 4 + 0];
150 rotated[(y*tex.
w + x) * 4 + 1] = data[(invy*tex.
w + invx) * 4 + 1];
151 rotated[(y*tex.
w + x) * 4 + 2] = data[(invy*tex.
w + invx) * 4 + 2];
152 rotated[(y*tex.
w + x) * 4 + 3] = data[(invy*tex.
w + invx) * 4 + 3];
156 glTexImage2D(types[i], 0, GL_RGB, tex.
w, tex.
h, 0, GL_RGBA, GL_UNSIGNED_BYTE, &rotated[0]);
160 glTexImage2D(types[i], 0, GL_RGB, tex.
w, tex.
h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
166 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
167 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
168 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
169 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
170 glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
172 glBindTexture(GL_TEXTURE_2D, 0);
199 std::vector<CStrW> skies;
203 const VfsPath path(L
"art/textures/skies/");
205 if(
g_VFS->GetDirectoryEntries(path, 0, &subdirectories) < 0)
207 LOGERROR(L
"Error opening directory '%ls'", path.
string().c_str());
208 return std::vector<CStrW>(1,
GetSkySet());
211 for(
size_t i = 0; i < subdirectories.size(); i++)
212 skies.push_back(subdirectories[i].string());
213 sort(skies.begin(), skies.end());
223 #warning TODO: implement SkyManager::RenderSky for GLES
236 glDepthMask( GL_FALSE );
238 pglActiveTextureARB(GL_TEXTURE0_ARB);
239 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
241 glMatrixMode(GL_MODELVIEW);
253 glRotatef( 180.0f +
RADTODEG(
g_Renderer.GetLightEnv().GetRotation()), 0.0f, 1.0f, 0.0f );
256 const float D = 2000.0;
263 skytech =
g_Renderer.GetShaderManager().LoadEffect(str_sky_simple);
264 skytech->BeginPass();
265 shader = skytech->GetShader();
270 glDisable(GL_TEXTURE_2D);
271 glEnable(GL_TEXTURE_CUBE_MAP);
277 glTexCoord3f( +1, +1, +1 ); glVertex3f( -D, -D, -D );
278 glTexCoord3f( +1, +1, -1 ); glVertex3f( -D, -D, +D );
279 glTexCoord3f( +1, -1, -1 ); glVertex3f( -D, +D, +D );
280 glTexCoord3f( +1, -1, +1 ); glVertex3f( -D, +D, -D );
285 glTexCoord3f( -1, +1, -1 ); glVertex3f( +D, -D, +D );
286 glTexCoord3f( -1, +1, +1 ); glVertex3f( +D, -D, -D );
287 glTexCoord3f( -1, -1, +1 ); glVertex3f( +D, +D, -D );
288 glTexCoord3f( -1, -1, -1 ); glVertex3f( +D, +D, +D );
293 glTexCoord3f( -1, +1, +1 ); glVertex3f( +D, -D, -D );
294 glTexCoord3f( -1, +1, -1 ); glVertex3f( +D, -D, +D );
295 glTexCoord3f( +1, +1, -1 ); glVertex3f( -D, -D, +D );
296 glTexCoord3f( +1, +1, +1 ); glVertex3f( -D, -D, -D );
302 glTexCoord3f( +1, -1, +1 ); glVertex3f( -D, +D, -D );
303 glTexCoord3f( +1, -1, -1 ); glVertex3f( -D, +D, +D );
304 glTexCoord3f( -1, -1, -1 ); glVertex3f( +D, +D, +D );
305 glTexCoord3f( -1, -1, +1 ); glVertex3f( +D, +D, -D );
310 glTexCoord3f( -1, +1, +1 ); glVertex3f( +D, -D, -D );
311 glTexCoord3f( +1, +1, +1 ); glVertex3f( -D, -D, -D );
312 glTexCoord3f( +1, -1, +1 ); glVertex3f( -D, +D, -D );
313 glTexCoord3f( -1, -1, +1 ); glVertex3f( +D, +D, -D );
318 glTexCoord3f( +1, +1, -1 ); glVertex3f( -D, -D, +D );
319 glTexCoord3f( -1, +1, -1 ); glVertex3f( +D, -D, +D );
320 glTexCoord3f( -1, -1, -1 ); glVertex3f( +D, +D, +D );
321 glTexCoord3f( +1, -1, -1 ); glVertex3f( -D, +D, +D );
330 glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
331 glDisable(GL_TEXTURE_CUBE_MAP);
332 glEnable(GL_TEXTURE_2D);
337 glDepthMask( GL_TRUE );
void RenderSky()
RenderSky: Render the sky.
Path VfsPath
VFS path of the form "(dir/)*file?".
Status tex_transform_to(Tex *t, size_t new_flags)
Change <t>'s pixel format (2nd version) (note: this is equivalent to tex_transform(t, t->flags^new_flags).
flags & TEX_DXT is a field indicating compression.
indicates the image contains an alpha channel.
shared_ptr< CShaderTechnique > CShaderTechniquePtr
std::vector< CStrW > GetSkySets() const
Return a sorted list of available sky sets, in a form suitable for passing to SetSkySet.
flags & TEX_ORIENTATION is a field indicating orientation, i.e.
const String & string() const
u8 * tex_get_data(const Tex *t)
rationale: since Tex is a struct, its fields are accessible to callers.
CStrW m_SkySet
Name of current skyset (a directory within art/textures/skies)
stores all data describing an image.
std::vector< OsPath > DirectoryNames
static const wchar_t * s_imageNames[numTextures]
const CStrW & GetSkySet() const
GetSkySet(): Return the currently selected sky set name.
void SetSkySet(const CStrW &name)
GetSkySet(): Set the sky set name, potentially loading the textures.
CVector3D GetTranslation() const
shared_ptr< CShaderProgram > CShaderProgramPtr
size_t flags
see TexFlags and "Format Conversion" in docs.
Status tex_decode(const shared_ptr< u8 > &data, size_t dataSize, Tex *t)
decode an in-memory texture file into texture object.
void tex_free(Tex *t)
free all resources associated with the image and make further use of it impossible.