mirror of
https://github.com/SFML/SFML.git
synced 2024-11-29 06:41:05 +08:00
Fixed images and shaders sometimes not updated when they are modified while they are used
git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/branches/sfml2@1427 4e206d99-4929-0410-ac5d-dfc041789085
This commit is contained in:
parent
76a76a784f
commit
6f6481ef38
@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
namespace sf
|
namespace sf
|
||||||
{
|
{
|
||||||
|
class Renderer;
|
||||||
class RenderImage;
|
class RenderImage;
|
||||||
class RenderWindow;
|
class RenderWindow;
|
||||||
|
|
||||||
@ -291,6 +292,7 @@ public :
|
|||||||
|
|
||||||
private :
|
private :
|
||||||
|
|
||||||
|
friend class Renderer;
|
||||||
friend class RenderImage;
|
friend class RenderImage;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
@ -315,6 +317,12 @@ private :
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void EnsureArrayUpdate() const;
|
void EnsureArrayUpdate() const;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// Make sure that the image is ready to be used
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
void Use() const;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// Reset the image attributes
|
/// Reset the image attributes
|
||||||
///
|
///
|
||||||
|
@ -38,6 +38,8 @@
|
|||||||
|
|
||||||
namespace sf
|
namespace sf
|
||||||
{
|
{
|
||||||
|
class Renderer;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Pixel/fragment shader class
|
/// \brief Pixel/fragment shader class
|
||||||
///
|
///
|
||||||
@ -317,6 +319,8 @@ public :
|
|||||||
|
|
||||||
private :
|
private :
|
||||||
|
|
||||||
|
friend class Renderer;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Create the program and attach the shaders
|
/// \brief Create the program and attach the shaders
|
||||||
///
|
///
|
||||||
@ -325,6 +329,25 @@ private :
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
bool CompileProgram();
|
bool CompileProgram();
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Bind all the textures used by the shader
|
||||||
|
///
|
||||||
|
/// This function each texture to a different unit, and
|
||||||
|
/// updates the corresponding variables in the shader accordingly.
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
void BindTextures() const;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Make sure that the shader is ready to be used
|
||||||
|
///
|
||||||
|
/// This function is called by the Renderer class, to make
|
||||||
|
/// sure that the shader's parameters are properly applied
|
||||||
|
/// even when Use() is not called due to internal optimizations.
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
void Use() const;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
// Types
|
// Types
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
|
@ -387,12 +387,12 @@ void Image::SetPixel(unsigned int x, unsigned int y, const Color& color)
|
|||||||
EnsureArrayUpdate();
|
EnsureArrayUpdate();
|
||||||
|
|
||||||
// Check if pixel is whithin the image bounds
|
// Check if pixel is whithin the image bounds
|
||||||
if ((x >= myWidth) || (y >= myHeight))
|
/*if ((x >= myWidth) || (y >= myHeight))
|
||||||
{
|
{
|
||||||
Err() << "Cannot set pixel (" << x << "," << y << ") for image "
|
Err() << "Cannot set pixel (" << x << "," << y << ") for image "
|
||||||
<< "(width = " << myWidth << ", height = " << myHeight << ")" << std::endl;
|
<< "(width = " << myWidth << ", height = " << myHeight << ")" << std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
myPixels[x + y * myWidth] = color;
|
myPixels[x + y * myWidth] = color;
|
||||||
|
|
||||||
@ -723,10 +723,6 @@ void Image::EnsureArrayUpdate() const
|
|||||||
{
|
{
|
||||||
if (!myArrayUpdated)
|
if (!myArrayUpdated)
|
||||||
{
|
{
|
||||||
// First make sure the texture is up-to-date
|
|
||||||
// (may not be the case if an external update has been scheduled)
|
|
||||||
EnsureTextureUpdate();
|
|
||||||
|
|
||||||
// Save the previous texture
|
// Save the previous texture
|
||||||
GLint previous;
|
GLint previous;
|
||||||
GLCheck(glGetIntegerv(GL_TEXTURE_BINDING_2D, &previous));
|
GLCheck(glGetIntegerv(GL_TEXTURE_BINDING_2D, &previous));
|
||||||
@ -779,6 +775,15 @@ void Image::EnsureArrayUpdate() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// Make sure that the image is ready to be used
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
void Image::Use() const
|
||||||
|
{
|
||||||
|
EnsureTextureUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// Reset the image attributes
|
/// Reset the image attributes
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
|
@ -248,6 +248,12 @@ void Renderer::SetTexture(const Image* texture)
|
|||||||
myTexture = texture;
|
myTexture = texture;
|
||||||
myTextureIsValid = true;
|
myTextureIsValid = true;
|
||||||
}
|
}
|
||||||
|
else if (texture)
|
||||||
|
{
|
||||||
|
// If the texture was already the current one, make sure that
|
||||||
|
// it is synchronized (in case it was modified since last use)
|
||||||
|
texture->Use();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -269,6 +275,12 @@ void Renderer::SetShader(const Shader* shader)
|
|||||||
myShaderIsValid = true;
|
myShaderIsValid = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (shader)
|
||||||
|
{
|
||||||
|
// If the shader was already the current one, make sure that
|
||||||
|
// it is synchronized (in case it was modified since last use)
|
||||||
|
shader->Use();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -245,15 +245,7 @@ void Shader::Bind() const
|
|||||||
GLCheck(glUseProgramObjectARB(myShaderProgram));
|
GLCheck(glUseProgramObjectARB(myShaderProgram));
|
||||||
|
|
||||||
// Bind the textures
|
// Bind the textures
|
||||||
TextureTable::const_iterator it = myTextures.begin();
|
BindTextures();
|
||||||
for (std::size_t i = 0; i < myTextures.size(); ++i)
|
|
||||||
{
|
|
||||||
GLint index = static_cast<GLsizei>(i + 1);
|
|
||||||
GLCheck(glUniform1iARB(it->first, index));
|
|
||||||
GLCheck(glActiveTextureARB(GL_TEXTURE0_ARB + index));
|
|
||||||
it->second->Bind();
|
|
||||||
it++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure that the texture unit which is left active is the number 0
|
// Make sure that the texture unit which is left active is the number 0
|
||||||
GLCheck(glActiveTextureARB(GL_TEXTURE0_ARB));
|
GLCheck(glActiveTextureARB(GL_TEXTURE0_ARB));
|
||||||
@ -397,4 +389,26 @@ bool Shader::CompileProgram()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
void Shader::BindTextures() const
|
||||||
|
{
|
||||||
|
TextureTable::const_iterator it = myTextures.begin();
|
||||||
|
for (std::size_t i = 0; i < myTextures.size(); ++i)
|
||||||
|
{
|
||||||
|
GLint index = static_cast<GLsizei>(i + 1);
|
||||||
|
GLCheck(glUniform1iARB(it->first, index));
|
||||||
|
GLCheck(glActiveTextureARB(GL_TEXTURE0_ARB + index));
|
||||||
|
it->second->Bind();
|
||||||
|
it++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
void Shader::Use() const
|
||||||
|
{
|
||||||
|
BindTextures();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace sf
|
} // namespace sf
|
||||||
|
Loading…
Reference in New Issue
Block a user