Merged from 1.4 branch revisions 1218:1234

git-svn-id: http://svn.code.sf.net/p/irrlicht/code/trunk@1235 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
hybrid 2008-02-09 14:12:28 +00:00
parent 7c4e227f15
commit a03ab4a47e
7 changed files with 94 additions and 128 deletions

View File

@ -71,7 +71,7 @@ namespace video
EmissiveColor(0,0,0,0), SpecularColor(255,255,255,255),
Shininess(0.0f), MaterialTypeParam(0.0f), MaterialTypeParam2(0.0f), Thickness(1.0f),
Wireframe(false), PointCloud(false), GouraudShading(true), Lighting(true),
ZBuffer(true), ZWriteEnable(true), BackfaceCulling(true),
ZBuffer(1), ZWriteEnable(true), BackfaceCulling(true),
FogEnable(false), NormalizeNormals(false)
{ }

View File

@ -75,7 +75,7 @@ void CAnimatedMeshSceneNode::setCurrentFrame(f32 frame)
}
//! Returns the current displayed frame number.
//! Returns the currently displayed frame number.
f32 CAnimatedMeshSceneNode::getFrameNr() const
{
return CurrentFrameNr;
@ -103,15 +103,14 @@ f32 CAnimatedMeshSceneNode::buildFrameNr(u32 timeMs)
{
// play animation looped
const s32 lenInMs = abs(s32( (EndFrame - StartFrame) / FramesPerSecond));
if (FramesPerSecond > 0.f) //forwards...
{
const s32 lenInTime = s32( f32(EndFrame - StartFrame) / FramesPerSecond);
return StartFrame + ( (timeMs - BeginFrameTime) % lenInTime) *FramesPerSecond;
return StartFrame + ( (timeMs - BeginFrameTime) % lenInMs) * FramesPerSecond;
}
else //backwards...
{
const s32 lenInTime = s32( f32(EndFrame - StartFrame) / -FramesPerSecond);
return EndFrame - ( (timeMs - BeginFrameTime) % lenInTime)*-FramesPerSecond;
return EndFrame - ( (timeMs - BeginFrameTime) % lenInMs)* -FramesPerSecond;
}
}
else
@ -122,7 +121,7 @@ f32 CAnimatedMeshSceneNode::buildFrameNr(u32 timeMs)
if (FramesPerSecond > 0.f) //forwards...
{
const f32 deltaFrame = floorf( f32 ( timeMs - BeginFrameTime ) * FramesPerSecond );
const f32 deltaFrame = ( timeMs - BeginFrameTime ) * FramesPerSecond;
frame = StartFrame + deltaFrame;
@ -135,7 +134,7 @@ f32 CAnimatedMeshSceneNode::buildFrameNr(u32 timeMs)
}
else //backwards... (untested)
{
const f32 deltaFrame = floorf( f32 ( timeMs - BeginFrameTime ) * -FramesPerSecond );
const f32 deltaFrame = ( timeMs - BeginFrameTime ) * -FramesPerSecond;
frame = EndFrame - deltaFrame;
@ -152,6 +151,7 @@ f32 CAnimatedMeshSceneNode::buildFrameNr(u32 timeMs)
}
}
//! frame
void CAnimatedMeshSceneNode::OnRegisterSceneNode()
{
@ -200,11 +200,9 @@ void CAnimatedMeshSceneNode::OnRegisterSceneNode()
}
//! OnAnimate() is called just before rendering the whole scene.
void CAnimatedMeshSceneNode::OnAnimate(u32 timeMs)
{
CurrentFrameNr = buildFrameNr ( timeMs );
if ( Mesh )
@ -218,25 +216,10 @@ void CAnimatedMeshSceneNode::OnAnimate(u32 timeMs)
*/
}
IAnimatedMeshSceneNode::OnAnimate ( timeMs );
}
/*
angle = dotproduct ( v(0,1,0), up )
axis = crossproduct ( v(0,1,0), up )
*/
inline void AlignToUpVector(core::matrix4 &m, const core::vector3df &up )
{
core::quaternion quatRot( up.Z, 0.f, -up.X, 1 + up.Y );
quatRot.normalize();
quatRot.getMatrix ( m );
}
//! renders the node.
void CAnimatedMeshSceneNode::render()
{
@ -452,7 +435,10 @@ void CAnimatedMeshSceneNode::render()
const video::S3DVertex* v = ( const video::S3DVertex*)mb->getVertices();
for ( u32 i=0; i != mb->getVertexCount(); ++i )
{
AlignToUpVector ( m2, v->Normal );
// Align to v->normal
core::quaternion quatRot( v->Normal.Z, 0.f, -v->Normal.X, 1 + v->Normal.Y );
quatRot.normalize();
quatRot.getMatrix ( m2 );
m2.setTranslation(v->Pos);
m2*=AbsoluteTransformation;

View File

@ -264,8 +264,8 @@ bool CD3D9Driver::initDriver(const core::dimension2d<s32>& screenSize, HWND hwnd
DWORD qualityLevels = 0;
if (SUCCEEDED(pID3D->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT,
devtype, present.BackBufferFormat, !fullScreen,
D3DMULTISAMPLE_4_SAMPLES, &qualityLevels)))
devtype, present.BackBufferFormat, !fullScreen,
D3DMULTISAMPLE_4_SAMPLES, &qualityLevels)))
{
// enable multi sampling
present.MultiSampleType = D3DMULTISAMPLE_4_SAMPLES;
@ -274,8 +274,8 @@ bool CD3D9Driver::initDriver(const core::dimension2d<s32>& screenSize, HWND hwnd
}
else
if (SUCCEEDED(pID3D->CheckDeviceMultiSampleType(D3DADAPTER_DEFAULT,
devtype, present.BackBufferFormat, !fullScreen,
D3DMULTISAMPLE_2_SAMPLES, &qualityLevels)))
devtype, present.BackBufferFormat, !fullScreen,
D3DMULTISAMPLE_2_SAMPLES, &qualityLevels)))
{
// enable multi sampling
present.MultiSampleType = D3DMULTISAMPLE_2_SAMPLES;
@ -549,7 +549,7 @@ bool CD3D9Driver::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const
case EVDF_MIP_MAP:
return (Caps.TextureCaps & D3DPTEXTURECAPS_MIPMAP) != 0;
case EVDF_MIP_MAP_AUTO_UPDATE:
// always return false because a lot of drivers claim they do
// always return false because a lot of drivers claim they do
// this but actually don't do this at all.
return false; //(Caps.Caps2 & D3DCAPS2_CANAUTOGENMIPMAP) != 0;
case EVDF_STENCIL_BUFFER:
@ -902,7 +902,7 @@ void CD3D9Driver::draw2DImage(const video::ITexture* texture, const core::rect<s
npos.UpperLeftCorner.X = ( destRect.UpperLeftCorner.X * xFact ) - 1.0f;
npos.UpperLeftCorner.Y = 1.0f - ( destRect.UpperLeftCorner.Y * yFact );
npos.LowerRightCorner.X = ( destRect.LowerRightCorner.X * xFact ) - 1.0f;
npos.LowerRightCorner.Y = 1.0f - ( destRect.LowerRightCorner.Y * yFact );
npos.LowerRightCorner.Y = 1.0f - ( destRect.LowerRightCorner.Y * yFact );
video::SColor temp[4] =
{
@ -1235,7 +1235,6 @@ bool CD3D9Driver::setRenderStates3DMode()
}
//! Can be called by an IMaterialRenderer to make its work easier.
void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMaterial& lastmaterial,
bool resetAllRenderstates)
@ -1338,7 +1337,6 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria
{
bool enable = (material.Shininess!=0.0f);
pID3DDevice->SetRenderState(D3DRS_SPECULARENABLE, enable);
pID3DDevice->SetRenderState(D3DRS_NORMALIZENORMALS, enable);
pID3DDevice->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);
}
@ -1376,7 +1374,7 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria
mode=D3DTADDRESS_BORDER;
break;
}
pID3DDevice->SetSamplerState(st, D3DSAMP_ADDRESSU, mode );
pID3DDevice->SetSamplerState(st, D3DSAMP_ADDRESSV, mode );
}
@ -1408,7 +1406,6 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria
}
//! sets the needed renderstates
void CD3D9Driver::setRenderStatesStencilShadowMode(bool zfail)
{
@ -1492,7 +1489,6 @@ void CD3D9Driver::setRenderStatesStencilShadowMode(bool zfail)
}
//! sets the needed renderstates
void CD3D9Driver::setRenderStatesStencilFillMode(bool alpha)
{
@ -1551,7 +1547,6 @@ void CD3D9Driver::setRenderStatesStencilFillMode(bool alpha)
}
//! sets the needed renderstates
void CD3D9Driver::setRenderStates2DMode(bool alpha, bool texture, bool alphaChannel)
{
@ -1560,42 +1555,41 @@ void CD3D9Driver::setRenderStates2DMode(bool alpha, bool texture, bool alphaChan
if (CurrentRenderMode != ERM_2D || Transformation3DChanged)
{
// unset last 3d material
if (CurrentRenderMode != ERM_2D)
{
if (static_cast<u32>(Material.MaterialType) < MaterialRenderers.size())
MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial();
setBasicRenderStates(SMaterial(), SMaterial(), true);
// everything that is wrongly set by SMaterial default
pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
pID3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
pID3DDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
pID3DDevice->SetTextureStageState(2, D3DTSS_COLOROP, D3DTOP_DISABLE);
pID3DDevice->SetTextureStageState(2, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
pID3DDevice->SetTextureStageState(3, D3DTSS_COLOROP, D3DTOP_DISABLE);
pID3DDevice->SetTextureStageState(3, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
pID3DDevice->SetRenderState( D3DRS_STENCILENABLE, FALSE );
pID3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
pID3DDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
pID3DDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0);
pID3DDevice->SetTransform( D3DTS_TEXTURE0, &UnitMatrixD3D9 );
}
core::matrix4 mat;
pID3DDevice->SetTransform(D3DTS_VIEW, (D3DMATRIX*)((void*)mat.pointer()));
pID3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)((void*)mat.pointer()));
pID3DDevice->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)((void*)mat.pointer()));
pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
//pID3DDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
pID3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
pID3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
pID3DDevice->SetRenderState(D3DRS_FOGENABLE, FALSE);
pID3DDevice->SetRenderState(D3DRS_SPECULARENABLE, FALSE);
pID3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
pID3DDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
pID3DDevice->SetTextureStageState(2, D3DTSS_COLOROP, D3DTOP_DISABLE);
pID3DDevice->SetTextureStageState(2, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
pID3DDevice->SetTextureStageState(3, D3DTSS_COLOROP, D3DTOP_DISABLE);
pID3DDevice->SetTextureStageState(3, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
pID3DDevice->SetRenderState( D3DRS_STENCILENABLE, FALSE );
pID3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
pID3DDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
pID3DDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
pID3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0);
pID3DDevice->SetTransform( D3DTS_TEXTURE0, &UnitMatrixD3D9 );
Transformation3DChanged = false;
// unset last 3d material
if (CurrentRenderMode == ERM_3D &&
Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size())
MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial();
}
if (texture)
@ -1673,7 +1667,6 @@ void CD3D9Driver::setRenderStates2DMode(bool alpha, bool texture, bool alphaChan
}
//! deletes all dynamic lights there are
void CD3D9Driver::deleteAllDynamicLights()
{
@ -1686,7 +1679,6 @@ void CD3D9Driver::deleteAllDynamicLights()
}
//! adds a dynamic light
void CD3D9Driver::addDynamicLight(const SLight& dl)
{
@ -1733,7 +1725,6 @@ void CD3D9Driver::addDynamicLight(const SLight& dl)
}
//! returns the maximal amount of dynamic lights the device can handle
u32 CD3D9Driver::getMaximalDynamicLightAmount() const
{
@ -1741,7 +1732,6 @@ u32 CD3D9Driver::getMaximalDynamicLightAmount() const
}
//! Sets the dynamic ambient light color. The default color is
//! (0,0,0,0) which means it is dark.
//! \param color: New color of the ambient light.
@ -1756,7 +1746,6 @@ void CD3D9Driver::setAmbientLight(const SColorf& color)
}
//! \return Returns the name of the video driver. Example: In case of the DIRECT3D9
//! driver, it would return "Direct3D9.0".
const wchar_t* CD3D9Driver::getName() const
@ -1765,7 +1754,6 @@ const wchar_t* CD3D9Driver::getName() const
}
//! Draws a shadow volume into the stencil buffer. To draw a stencil shadow, do
//! this: Frist, draw all geometry. Then use this method, to draw the shadow
//! volume. Then, use IVideoDriver::drawStencilShadow() to visualize the shadow.

View File

@ -549,6 +549,9 @@ IGUISkin* CGUIEnvironment::getSkin() const
//! Sets a new GUI Skin
void CGUIEnvironment::setSkin(IGUISkin* skin)
{
if (CurrentSkin==skin)
return;
if (CurrentSkin)
CurrentSkin->drop();

View File

@ -1432,6 +1432,7 @@ video::ITexture* COpenGLDriver::createDeviceDependentTexture(IImage* surface, co
return new COpenGLTexture(surface, name, this);
}
//! Sets a material. All 3d drawing functions draw geometry now
//! using this material.
//! \param material: Material to be used from now on.
@ -1447,7 +1448,6 @@ void COpenGLDriver::setMaterial(const SMaterial& material)
}
//! prints error if an error happened.
bool COpenGLDriver::testGLError()
{
@ -1479,7 +1479,6 @@ bool COpenGLDriver::testGLError()
}
//! sets the needed renderstates
void COpenGLDriver::setRenderStates3DMode()
{
@ -1512,11 +1511,11 @@ void COpenGLDriver::setRenderStates3DMode()
// unset old material
if (LastMaterial.MaterialType != Material.MaterialType &&
LastMaterial.MaterialType >= 0 && LastMaterial.MaterialType < static_cast<s32>(MaterialRenderers.size()))
static_cast<u32>(LastMaterial.MaterialType) < MaterialRenderers.size())
MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial();
// set new material.
if (Material.MaterialType >= 0 && Material.MaterialType < static_cast<s32>(MaterialRenderers.size()))
if (static_cast<u32>(Material.MaterialType) < MaterialRenderers.size())
MaterialRenderers[Material.MaterialType].Renderer->OnSetMaterial(
Material, LastMaterial, ResetRenderStates, this);
@ -1524,7 +1523,7 @@ void COpenGLDriver::setRenderStates3DMode()
ResetRenderStates = false;
}
if (Material.MaterialType >= 0 && Material.MaterialType < static_cast<s32>(MaterialRenderers.size()))
if (static_cast<u32>(Material.MaterialType) < MaterialRenderers.size())
MaterialRenderers[Material.MaterialType].Renderer->OnRender(this, video::EVT_STANDARD);
CurrentRenderMode = ERM_3D;
@ -1615,12 +1614,11 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
}
// fillmode
if (resetAllRenderStates || lastmaterial.Wireframe != material.Wireframe || lastmaterial.PointCloud != material.PointCloud)
if (resetAllRenderStates || (lastmaterial.Wireframe != material.Wireframe) || (lastmaterial.PointCloud != material.PointCloud))
glPolygonMode(GL_FRONT_AND_BACK, material.Wireframe ? GL_LINE : material.PointCloud? GL_POINT : GL_FILL);
// shademode
if (resetAllRenderStates || lastmaterial.GouraudShading != material.GouraudShading)
if (resetAllRenderStates || (lastmaterial.GouraudShading != material.GouraudShading))
{
if (material.GouraudShading)
glShadeModel(GL_SMOOTH);
@ -1629,8 +1627,7 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
}
// lighting
if (resetAllRenderStates || lastmaterial.Lighting != material.Lighting)
if (resetAllRenderStates || (lastmaterial.Lighting != material.Lighting))
{
if (material.Lighting)
glEnable(GL_LIGHTING);
@ -1669,7 +1666,6 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
}
// back face culling
if (resetAllRenderStates || lastmaterial.BackfaceCulling != material.BackfaceCulling)
{
if (material.BackfaceCulling)
@ -1784,16 +1780,21 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
}
//! sets the needed renderstates
void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaChannel)
{
if (CurrentRenderMode != ERM_2D || Transformation3DChanged)
{
// unset last 3d material
if (CurrentRenderMode == ERM_3D && Material.MaterialType >= 0 &&
Material.MaterialType < static_cast<s32>(MaterialRenderers.size()))
MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial();
if (CurrentRenderMode == ERM_3D)
{
if (static_cast<u32>(Material.MaterialType) < MaterialRenderers.size())
MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial();
setBasicRenderStates(SMaterial(), SMaterial(), true);
// everything that is wrongly set by SMaterial default
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
}
GLfloat glmat[16];
core::matrix4 m;
@ -1815,17 +1816,6 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh
glLoadIdentity();
Transformation3DChanged = false;
glDisable(GL_DEPTH_TEST);
glDisable(GL_FOG);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_ALPHA_TEST);
glCullFace(GL_BACK);
}
if (texture)
@ -2052,7 +2042,7 @@ void COpenGLDriver::drawStencilShadowVolume(const core::vector3df* triangles, s3
// unset last 3d material
if (CurrentRenderMode == ERM_3D &&
Material.MaterialType >= 0 && Material.MaterialType < static_cast<s32>(MaterialRenderers.size()))
static_cast<u32>(Material.MaterialType) < MaterialRenderers.size())
{
MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial();
ResetRenderStates = true;
@ -2365,6 +2355,7 @@ s32 COpenGLDriver::addShaderMaterial(const c8* vertexShaderProgram,
return nr;
}
//! Adds a new material renderer to the VideoDriver, using GLSL to render geometry.
s32 COpenGLDriver::addHighLevelShaderMaterial(
const c8* vertexShaderProgram,
@ -2445,7 +2436,7 @@ u32 COpenGLDriver::getMaximalPrimitiveCount() const
//! checks triangle count and print warning if wrong
bool COpenGLDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuffer,
bool clearZBuffer, SColor color)
bool clearZBuffer, SColor color)
{
// check for right driver type
@ -2595,6 +2586,7 @@ bool COpenGLDriver::setClipPlane(u32 index, const core::plane3df& plane, bool en
return true;
}
void COpenGLDriver::uploadClipPlane(u32 index)
{
// opengl needs an array of doubles for the plane equation
@ -2606,6 +2598,7 @@ void COpenGLDriver::uploadClipPlane(u32 index)
glClipPlane(GL_CLIP_PLANE0 + index, clip_plane);
}
//! Enable/disable a clipping plane.
//! There are at least 6 clipping planes available for the user to set at will.
//! \param index: The plane index. Must be between 0 and MaxUserClipPlanes.

View File

@ -40,7 +40,7 @@ CSkyDomeSceneNode::CSkyDomeSceneNode(video::ITexture* sky, u32 horiRes, u32 vert
f64 radius = 1000.0; /* Adjust this to get more or less perspective distorsion. */
f64 azimuth, azimuth_step;
f64 elevation, elevation_step;
u32 k, c;
u32 k;
video::S3DVertex vtx;
@ -60,57 +60,54 @@ CSkyDomeSceneNode::CSkyDomeSceneNode(video::ITexture* sky, u32 horiRes, u32 vert
spherePercentage=2.;
elevation_step = spherePercentage*core::PI64/2./(f64)vertRes;
Buffer.Vertices.set_used((horiRes+1)*(vertRes+1));
Buffer.Indices.set_used(3*(2*vertRes-1)*horiRes);
Buffer.Vertices.reallocate((horiRes+1)*(vertRes+1));
Buffer.Indices.reallocate(3*(2*vertRes-1)*horiRes);
vtx.Color.set(255,255,255,255);
vtx.Normal.set(0.0f,0.0f,0.0f);
c = 0;
const f32 tcV = (f32)texturePercentage/(f32)vertRes;
for (k = 0, azimuth = 0; k <= horiRes; ++k)
{
elevation = core::PI64/2.;
const f32 tcU = (f32)k/(f32)horiRes;
const f64 sinA = sin(azimuth);
const f64 cosA = cos(azimuth);
for (u32 j = 0; j <= vertRes; ++j)
{
vtx.Pos.set((f32) (radius*cos(elevation)*sin(azimuth)),
(f32) (radius*sin(elevation)+50.0f),
(f32) (radius*cos(elevation)*cos(azimuth)));
const f64 cosEr = radius*cos(elevation);
vtx.Pos.set((f32) (cosEr*sinA),
(f32) (radius*sin(elevation)+50.0f),
(f32) (cosEr*cosA));
vtx.TCoords.set((f32)k/(f32)horiRes, (f32)j/(f32)vertRes*(f32)texturePercentage);
vtx.TCoords.set(tcU, (f32)j*tcV);
Buffer.Vertices[c++] = vtx;
Buffer.Vertices.push_back(vtx);
elevation -= elevation_step;
}
azimuth += azimuth_step;
}
c = 0;
for (k = 0; k < horiRes; ++k)
{
Buffer.Indices[c++] = vertRes+2+(vertRes+1)*k;
Buffer.Indices[c++] = 1+(vertRes+1)*k;
Buffer.Indices[c++] = 0+(vertRes+1)*k;
Buffer.Indices.push_back(vertRes+2+(vertRes+1)*k);
Buffer.Indices.push_back(1+(vertRes+1)*k);
Buffer.Indices.push_back(0+(vertRes+1)*k);
for (u32 j = 1; j < vertRes; ++j)
{
Buffer.Indices[c++] = vertRes+2+(vertRes+1)*k+j;
Buffer.Indices[c++] = 1+(vertRes+1)*k+j;
Buffer.Indices[c++] = 0+(vertRes+1)*k+j;
Buffer.Indices.push_back(vertRes+2+(vertRes+1)*k+j);
Buffer.Indices.push_back(1+(vertRes+1)*k+j);
Buffer.Indices.push_back(0+(vertRes+1)*k+j);
Buffer.Indices[c++] = vertRes+1+(vertRes+1)*k+j;
Buffer.Indices[c++] = vertRes+2+(vertRes+1)*k+j;
Buffer.Indices[c++] = 0+(vertRes+1)*k+j;
Buffer.Indices.push_back(vertRes+1+(vertRes+1)*k+j);
Buffer.Indices.push_back(vertRes+2+(vertRes+1)*k+j);
Buffer.Indices.push_back(0+(vertRes+1)*k+j);
}
}
}
//! destructor
CSkyDomeSceneNode::~CSkyDomeSceneNode()
{
}
//! renders the node.
void CSkyDomeSceneNode::render()
{

View File

@ -20,7 +20,6 @@ class CSkyDomeSceneNode : public ISceneNode
CSkyDomeSceneNode(video::ITexture* texture, u32 horiRes, u32 vertRes,
f64 texturePercentage, f64 spherePercentage, ISceneNode* root,
ISceneManager* smgr, s32 id);
virtual ~CSkyDomeSceneNode();
virtual void OnRegisterSceneNode();
virtual void render();
virtual const core::aabbox3d<f32>& getBoundingBox() const;