bool TiledTextureImage::DirectUpdate(gfx::DataSourceSurface* aSurf, const nsIntRegion& aRegion, const gfx::IntPoint& aFrom /* = gfx::IntPoint(0, 0) */) { if (mSize.width == 0 || mSize.height == 0) { return true; } nsIntRegion region; if (mTextureState != Valid) { IntRect bounds = IntRect(0, 0, mSize.width, mSize.height); region = nsIntRegion(bounds); } else { region = aRegion; } bool result = true; int oldCurrentImage = mCurrentImage; BeginBigImageIteration(); do { IntRect tileRect = GetSrcTileRect(); int xPos = tileRect.x; int yPos = tileRect.y; nsIntRegion tileRegion; tileRegion.And(region, tileRect); // intersect with tile if (tileRegion.IsEmpty()) continue; if (CanUploadSubTextures(mGL)) { tileRegion.MoveBy(-xPos, -yPos); // translate into tile local space } else { // If sub-textures are unsupported, expand to tile boundaries tileRect.x = tileRect.y = 0; tileRegion = nsIntRegion(tileRect); } result &= mImages[mCurrentImage]-> DirectUpdate(aSurf, tileRegion, aFrom + gfx::IntPoint(xPos, yPos)); if (mCurrentImage == mImages.Length() - 1) { // We know we're done, but we still need to ensure that the callback // gets called (e.g. to update the uploaded region). NextTile(); break; } // Override a callback cancelling iteration if the texture wasn't valid. // We need to force the update in that situation, or we may end up // showing invalid/out-of-date texture data. } while (NextTile() || (mTextureState != Valid)); mCurrentImage = oldCurrentImage; mTextureFormat = mImages[0]->GetTextureFormat(); mTextureState = Valid; return result; }
void Entite_graphique::Initialiser(const coordonnee &pos) { if(m_tileset != NULL) { NextTile(true, true); Generer(); if(configuration->Lumiere) if(m_tileset->getTaille() > 0) { AddWallLight(pos); if(option_forcedLight) { sf::Vector2f position; position.x = pos.x + m_decalage.x; position.y = pos.y + m_decalage.y; m_light = moteurGraphique->LightManager->Add_Dynamic_Light(position,m_tileset->getLumiereDuTile(m_noAnimation).intensite > 0 ? 255 : 0,m_tileset->getLumiereDuTile(m_noAnimation).intensite*3,12, sf::Color(m_tileset->getLumiereDuTile(m_noAnimation).rouge, m_tileset->getLumiereDuTile(m_noAnimation).vert, m_tileset->getLumiereDuTile(m_noAnimation).bleu)); } } } }
void Entite_graphique::Animer(float temps) { attaque_touche = false; attaque_stop = false; attaque_pause = false; if(m_tileset != NULL) { float tempsAnimation = m_tileset->getTempsDuTile(m_noAnimation) + m_nextAnimation; m_animation += temps; if(configuration->Lumiere > 0) if(m_old_lightIntensity != m_tileset->getLumiereDuTile(m_noAnimation).intensite && m_tileset->getLumiereDuTile(m_noAnimation).intensite >= 0)// && !option_forcedLight) { float intensite = m_old_lightIntensity; intensite += m_animation/tempsAnimation * (m_tileset->getLumiereDuTile(m_noAnimation).intensite - m_old_lightIntensity); moteurGraphique->LightManager->SetRadius(m_light,(int)intensite*3); if (m_animation >= tempsAnimation) m_old_lightIntensity = m_tileset->getLumiereDuTile(m_noAnimation).intensite; moteurGraphique->LightManager->Generate(m_light); } if (m_tileset->getAnimationTile(m_noAnimation) >=0)//!= m_noAnimation) while (m_animation >= tempsAnimation && tempsAnimation > 0) { //if(m_tileset->getAnimationTile(m_noAnimation) != m_noAnimation) NextTile(); Generer(); m_animation -= tempsAnimation; tempsAnimation = m_tileset->getTempsDuTile(m_noAnimation) + m_nextAnimation; } } }