Merge upstream
This commit is contained in:
commit
85452bf2cf
|
@ -97,6 +97,15 @@ DEF_FADE( me )
|
||||||
|
|
||||||
DEF_PLAY_STOP( se )
|
DEF_PLAY_STOP( se )
|
||||||
|
|
||||||
|
RB_METHOD(audioSetupMidi)
|
||||||
|
{
|
||||||
|
RB_UNUSED_PARAM;
|
||||||
|
|
||||||
|
shState->audio().setupMidi();
|
||||||
|
|
||||||
|
return Qnil;
|
||||||
|
}
|
||||||
|
|
||||||
RB_METHOD(audioReset)
|
RB_METHOD(audioReset)
|
||||||
{
|
{
|
||||||
RB_UNUSED_PARAM;
|
RB_UNUSED_PARAM;
|
||||||
|
@ -135,6 +144,8 @@ audioBindingInit()
|
||||||
{
|
{
|
||||||
BIND_POS( bgm );
|
BIND_POS( bgm );
|
||||||
BIND_POS( bgs );
|
BIND_POS( bgs );
|
||||||
|
|
||||||
|
_rb_define_module_function(module, "setup_midi", audioSetupMidi);
|
||||||
}
|
}
|
||||||
|
|
||||||
BIND_PLAY_STOP( se )
|
BIND_PLAY_STOP( se )
|
||||||
|
|
|
@ -1,48 +1,40 @@
|
||||||
|
|
||||||
uniform sampler2D inputTexture;
|
uniform sampler2D texture;
|
||||||
uniform float hueAdjust;
|
uniform mediump float hueAdjust;
|
||||||
|
|
||||||
varying vec2 v_texCoord;
|
varying vec2 v_texCoord;
|
||||||
|
|
||||||
|
/* Source: gamedev.stackexchange.com/a/59808/24839 */
|
||||||
|
vec3 rgb2hsv(vec3 c)
|
||||||
|
{
|
||||||
|
const vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
|
||||||
|
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
|
||||||
|
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));
|
||||||
|
|
||||||
|
float d = q.x - min(q.w, q.y);
|
||||||
|
|
||||||
|
/* Avoid divide-by-zero situations by adding a very tiny delta.
|
||||||
|
* Since we always deal with underlying 8-Bit color values, this
|
||||||
|
* should never mask a real value */
|
||||||
|
const float eps = 1.0e-10;
|
||||||
|
|
||||||
|
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + eps)), d / (q.x + eps), q.x);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 hsv2rgb(vec3 c)
|
||||||
|
{
|
||||||
|
const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
|
||||||
|
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
|
||||||
|
return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
|
||||||
|
}
|
||||||
|
|
||||||
void main ()
|
void main ()
|
||||||
{
|
{
|
||||||
const vec4 kRGBToYPrime = vec4 (0.299, 0.587, 0.114, 0.0);
|
vec4 color = texture2D (texture, v_texCoord.xy);
|
||||||
const vec4 kRGBToI = vec4 (0.596, -0.275, -0.321, 0.0);
|
vec3 hsv = rgb2hsv(color.rgb);
|
||||||
const vec4 kRGBToQ = vec4 (0.212, -0.523, 0.311, 0.0);
|
|
||||||
|
|
||||||
const vec4 kYIQToR = vec4 (1.0, 0.956, 0.621, 0.0);
|
hsv.x += hueAdjust;
|
||||||
const vec4 kYIQToG = vec4 (1.0, -0.272, -0.647, 0.0);
|
color.rgb = hsv2rgb(hsv);
|
||||||
const vec4 kYIQToB = vec4 (1.0, -1.107, 1.704, 0.0);
|
|
||||||
|
|
||||||
/* Sample the input pixel */
|
gl_FragColor = color;
|
||||||
vec4 color = texture2D (inputTexture, v_texCoord.xy);
|
|
||||||
|
|
||||||
/* Convert to YIQ */
|
|
||||||
float YPrime = dot (color, kRGBToYPrime);
|
|
||||||
float I = dot (color, kRGBToI);
|
|
||||||
float Q = dot (color, kRGBToQ);
|
|
||||||
|
|
||||||
/* Calculate the hue and chroma */
|
|
||||||
float hue = atan (Q, I);
|
|
||||||
float chroma = sqrt (I * I + Q * Q);
|
|
||||||
|
|
||||||
/* Make the user's adjustments */
|
|
||||||
hue += hueAdjust;
|
|
||||||
|
|
||||||
/* Remember old I and color */
|
|
||||||
float IOriginal = I;
|
|
||||||
vec4 coOriginal = color;
|
|
||||||
|
|
||||||
/* Convert back to YIQ */
|
|
||||||
Q = chroma * sin (hue);
|
|
||||||
I = chroma * cos (hue);
|
|
||||||
|
|
||||||
/* Convert back to RGB */
|
|
||||||
vec4 yIQ = vec4 (YPrime, I, Q, 0.0);
|
|
||||||
color.r = dot (yIQ, kYIQToR);
|
|
||||||
color.g = dot (yIQ, kYIQToG);
|
|
||||||
color.b = dot (yIQ, kYIQToB);
|
|
||||||
|
|
||||||
/* Save the result */
|
|
||||||
gl_FragColor = (IOriginal == 0.0) ? coOriginal : color;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -235,9 +235,9 @@ struct BitmapPrivate
|
||||||
surf = surfConv;
|
surf = surfConv;
|
||||||
}
|
}
|
||||||
|
|
||||||
void onModified()
|
void onModified(bool freeSurface = true)
|
||||||
{
|
{
|
||||||
if (surface)
|
if (surface && freeSurface)
|
||||||
{
|
{
|
||||||
SDL_FreeSurface(surface);
|
SDL_FreeSurface(surface);
|
||||||
surface = 0;
|
surface = 0;
|
||||||
|
@ -883,6 +883,14 @@ void Bitmap::clear()
|
||||||
p->onModified();
|
p->onModified();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t &getPixelAt(SDL_Surface *surf, SDL_PixelFormat *form, int x, int y)
|
||||||
|
{
|
||||||
|
size_t offset = x*form->BytesPerPixel + y*surf->pitch;
|
||||||
|
uint8_t *bytes = (uint8_t*) surf->pixels + offset;
|
||||||
|
|
||||||
|
return *((uint32_t*) bytes);
|
||||||
|
}
|
||||||
|
|
||||||
Color Bitmap::getPixel(int x, int y) const
|
Color Bitmap::getPixel(int x, int y) const
|
||||||
{
|
{
|
||||||
guardDisposed();
|
guardDisposed();
|
||||||
|
@ -905,9 +913,7 @@ Color Bitmap::getPixel(int x, int y) const
|
||||||
glState.viewport.pop();
|
glState.viewport.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t offset = x*p->format->BytesPerPixel + y*p->surface->pitch;
|
uint32_t pixel = getPixelAt(p->surface, p->format, x, y);
|
||||||
uint8_t *bytes = (uint8_t*) p->surface->pixels + offset;
|
|
||||||
uint32_t pixel = *((uint32_t*) bytes);
|
|
||||||
|
|
||||||
return Color((pixel >> p->format->Rshift) & 0xFF,
|
return Color((pixel >> p->format->Rshift) & 0xFF,
|
||||||
(pixel >> p->format->Gshift) & 0xFF,
|
(pixel >> p->format->Gshift) & 0xFF,
|
||||||
|
@ -934,7 +940,16 @@ void Bitmap::setPixel(int x, int y, const Color &color)
|
||||||
|
|
||||||
p->addTaintedArea(IntRect(x, y, 1, 1));
|
p->addTaintedArea(IntRect(x, y, 1, 1));
|
||||||
|
|
||||||
p->onModified();
|
/* Setting just a single pixel is no reason to throw away the
|
||||||
|
* whole cached surface; we can just apply the same change */
|
||||||
|
|
||||||
|
if (p->surface)
|
||||||
|
{
|
||||||
|
uint32_t &surfPixel = getPixelAt(p->surface, p->format, x, y);
|
||||||
|
surfPixel = SDL_MapRGBA(p->format, pixel[0], pixel[1], pixel[2], pixel[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
p->onModified(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Bitmap::hueChange(int hue)
|
void Bitmap::hueChange(int hue)
|
||||||
|
@ -954,13 +969,10 @@ void Bitmap::hueChange(int hue)
|
||||||
quad.setTexPosRect(texRect, texRect);
|
quad.setTexPosRect(texRect, texRect);
|
||||||
quad.setColor(Vec4(1, 1, 1, 1));
|
quad.setColor(Vec4(1, 1, 1, 1));
|
||||||
|
|
||||||
/* Calculate hue parameter */
|
|
||||||
hue = wrapRange(hue, 0, 359);
|
|
||||||
float hueAdj = -((M_PI * 2) / 360) * hue;
|
|
||||||
|
|
||||||
HueShader &shader = shState->shaders().hue;
|
HueShader &shader = shState->shaders().hue;
|
||||||
shader.bind();
|
shader.bind();
|
||||||
shader.setHueAdjust(hueAdj);
|
/* Shader expects normalized value */
|
||||||
|
shader.setHueAdjust(wrapRange(hue, 0, 359) / 360.0f);
|
||||||
|
|
||||||
FBO::bind(newTex.fbo);
|
FBO::bind(newTex.fbo);
|
||||||
p->pushSetViewport(shader);
|
p->pushSetViewport(shader);
|
||||||
|
|
|
@ -551,7 +551,6 @@ HueShader::HueShader()
|
||||||
ShaderBase::init();
|
ShaderBase::init();
|
||||||
|
|
||||||
GET_U(hueAdjust);
|
GET_U(hueAdjust);
|
||||||
GET_U(inputTexture);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HueShader::setHueAdjust(float value)
|
void HueShader::setHueAdjust(float value)
|
||||||
|
@ -559,11 +558,6 @@ void HueShader::setHueAdjust(float value)
|
||||||
gl.Uniform1f(u_hueAdjust, value);
|
gl.Uniform1f(u_hueAdjust, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HueShader::setInputTexture(TEX::ID tex)
|
|
||||||
{
|
|
||||||
setTexUniform(u_inputTexture, 0, tex);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
SimpleMatrixShader::SimpleMatrixShader()
|
SimpleMatrixShader::SimpleMatrixShader()
|
||||||
{
|
{
|
||||||
|
|
|
@ -241,10 +241,9 @@ public:
|
||||||
HueShader();
|
HueShader();
|
||||||
|
|
||||||
void setHueAdjust(float value);
|
void setHueAdjust(float value);
|
||||||
void setInputTexture(TEX::ID tex);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GLint u_hueAdjust, u_inputTexture;
|
GLint u_hueAdjust;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SimpleMatrixShader : public ShaderBase
|
class SimpleMatrixShader : public ShaderBase
|
||||||
|
|
|
@ -134,12 +134,23 @@ struct SpritePrivate
|
||||||
|
|
||||||
void onSrcRectChange()
|
void onSrcRectChange()
|
||||||
{
|
{
|
||||||
if (mirrored)
|
FloatRect rect = srcRect->toFloatRect();
|
||||||
quad.setTexRect(srcRect->toFloatRect().hFlipped());
|
Vec2i bmSize;
|
||||||
else
|
|
||||||
quad.setTexRect(srcRect->toFloatRect());
|
|
||||||
|
|
||||||
quad.setPosRect(IntRect(0, 0, srcRect->width, srcRect->height));
|
if (bitmap)
|
||||||
|
bmSize = Vec2i(bitmap->width(), bitmap->height());
|
||||||
|
|
||||||
|
if (mirrored)
|
||||||
|
rect = rect.hFlipped();
|
||||||
|
|
||||||
|
/* Clamp the rectangle so it doesn't reach outside
|
||||||
|
* the bitmap bounds */
|
||||||
|
rect.w = clamp<int>(rect.w, 0, bmSize.x-rect.x);
|
||||||
|
rect.h = clamp<int>(rect.h, 0, bmSize.y-rect.y);
|
||||||
|
|
||||||
|
quad.setTexRect(rect);
|
||||||
|
|
||||||
|
quad.setPosRect(FloatRect(0, 0, rect.w, rect.h));
|
||||||
recomputeBushDepth();
|
recomputeBushDepth();
|
||||||
|
|
||||||
wave.dirty = true;
|
wave.dirty = true;
|
||||||
|
|
|
@ -852,10 +852,15 @@ void WindowVX::move(int x, int y, int width, int height)
|
||||||
|
|
||||||
const Vec2i size(std::max(0, width), std::max(0, height));
|
const Vec2i size(std::max(0, width), std::max(0, height));
|
||||||
|
|
||||||
if (p->geo.w != size.x || p->geo.h != size.y)
|
if (p->geo.size() != size)
|
||||||
|
{
|
||||||
|
p->base.vertDirty = true;
|
||||||
p->base.texSizeDirty = true;
|
p->base.texSizeDirty = true;
|
||||||
|
p->clipRectDirty = true;
|
||||||
|
p->ctrlVertDirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
p->geo = IntRect(x, y, size.x, size.y);
|
p->geo = IntRect(Vec2i(x, y), size);
|
||||||
p->updateBaseQuad();
|
p->updateBaseQuad();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue