DPSOFTRAST_Flush();
if (pixels)
{
- dst = texture->bytes + (blocky * texture->mipmap[0][2] + blockx) * 4;
+ dst = texture->bytes + texture->mipmap[0][1] +(-blocky * texture->mipmap[0][2] + blockx) * 4;
while (blockheight > 0)
{
+ dst -= texture->mipmap[0][2] * 4;
memcpy(dst, pixels, blockwidth * 4);
pixels += blockwidth * 4;
- dst += texture->mipmap[0][2] * 4;
blockheight--;
}
}
if (texture->binds)
DPSOFTRAST_Flush();
if (pixels)
- memcpy(texture->bytes, pixels, texture->mipmap[0][1]);
+ {
+ int i, stride = texture->mipmap[0][2]*4;
+ unsigned char *dst = texture->bytes + texture->mipmap[0][1];
+ for (i = texture->mipmap[0][3];i > 0;i--)
+ {
+ dst -= stride;
+ memcpy(dst, pixels, stride);
+ pixels += stride;
+ }
+ }
DPSOFTRAST_Texture_CalculateMipmaps(index);
}
int DPSOFTRAST_Texture_GetWidth(int index, int mip)
if (th > sh) th = sh;
if (tw < 1 || th < 1)
return;
- sy1 = sheight - 1 - sy1;
+ sy1 = sheight - sy1 - th;
+ ty1 = theight - ty1 - th;
for (y = 0;y < th;y++)
- memcpy(tpixels + ((ty1 + y) * twidth + tx1), spixels + ((sy1 - y) * swidth + sx1), tw*4);
+ memcpy(tpixels + ((ty1 + y) * twidth + tx1), spixels + ((sy1 + y) * swidth + sx1), tw*4);
if (texture->mipmaps > 1)
DPSOFTRAST_Texture_CalculateMipmaps(index);
}
const unsigned char * RESTRICT pixel[4];
int width = texture->mipmap[mip][2], height = texture->mipmap[mip][3];
int wrapmask[2] = { width-1, height-1 };
- pixelbase = (unsigned char *)texture->bytes + texture->mipmap[mip][0];
+ pixelbase = (unsigned char *)texture->bytes + texture->mipmap[mip][0] + texture->mipmap[mip][1] - 4*width;
if(texture->filter & DPSOFTRAST_TEXTURE_FILTER_LINEAR)
{
unsigned int tc[2] = { x * (width<<12) - 2048, y * (height<<12) - 2048};
tci1[0] &= wrapmask[0];
tci1[1] &= wrapmask[1];
}
- pixel[0] = pixelbase + 4 * (tci[1]*width+tci[0]);
- pixel[1] = pixelbase + 4 * (tci[1]*width+tci1[0]);
- pixel[2] = pixelbase + 4 * (tci1[1]*width+tci[0]);
- pixel[3] = pixelbase + 4 * (tci1[1]*width+tci1[0]);
+ pixel[0] = pixelbase + 4 * (tci[0] - tci[1]*width);
+ pixel[1] = pixelbase + 4 * (tci[0] - tci[1]*width);
+ pixel[2] = pixelbase + 4 * (tci[0] - tci1[1]*width);
+ pixel[3] = pixelbase + 4 * (tci[0] - tci1[1]*width);
c[0] = (pixel[0][0]*lerp[0]+pixel[1][0]*lerp[1]+pixel[2][0]*lerp[2]+pixel[3][0]*lerp[3])>>24;
c[1] = (pixel[0][1]*lerp[0]+pixel[1][1]*lerp[1]+pixel[2][1]*lerp[2]+pixel[3][1]*lerp[3])>>24;
c[2] = (pixel[0][2]*lerp[0]+pixel[1][2]*lerp[1]+pixel[2][2]*lerp[2]+pixel[3][2]*lerp[3])>>24;
tci[0] &= wrapmask[0];
tci[1] &= wrapmask[1];
}
- pixel[0] = pixelbase + 4 * (tci[1]*width+tci[0]);
+ pixel[0] = pixelbase + 4 * (tci[0] - tci[1]*width);
c[0] = pixel[0][0];
c[1] = pixel[0][1];
c[2] = pixel[0][2];
return;
}
mip = triangle->mip[texunitindex];
- pixelbase = (unsigned char *)texture->bytes + texture->mipmap[mip][0];
+ pixelbase = (unsigned char *)texture->bytes + texture->mipmap[mip][0] + texture->mipmap[mip][1] - 4*texture->mipmap[mip][2];
// if this mipmap of the texture is 1 pixel, just fill it with that color
if (texture->mipmap[mip][1] == 4)
{
flags = texture->flags;
tcscale[0] = texture->mipmap[mip][2];
tcscale[1] = texture->mipmap[mip][3];
- tciwidth = texture->mipmap[mip][2];
+ tciwidth = -texture->mipmap[mip][2];
tcimin[0] = 0;
tcimin[1] = 0;
tcimax[0] = texture->mipmap[mip][2]-1;
return;
}
mip = triangle->mip[texunitindex];
- pixelbase = (const unsigned char *)texture->bytes + texture->mipmap[mip][0];
+ pixelbase = (const unsigned char *)texture->bytes + texture->mipmap[mip][0] + texture->mipmap[mip][1] - 4*texture->mipmap[mip][2];
// if this mipmap of the texture is 1 pixel, just fill it with that color
if (texture->mipmap[mip][1] == 4)
{
if (filter)
endtc = _mm_sub_ps(endtc, _mm_set1_ps(0.5f));
endsubtc = _mm_cvtps_epi32(_mm_mul_ps(endtc, _mm_set1_ps(65536.0f)));
- tcoffset = _mm_add_epi32(_mm_slli_epi32(_mm_shuffle_epi32(tcsize, _MM_SHUFFLE(0, 0, 0, 0)), 18), _mm_set1_epi32(4));
+ tcoffset = _mm_add_epi32(_mm_slli_epi32(_mm_sub_epi32(_mm_setzero_si128(), _mm_shuffle_epi32(tcsize, _MM_SHUFFLE(0, 0, 0, 0))), 18), _mm_set1_epi32(4));
tcmax = _mm_packs_epi32(tcmask, tcmask);
for (x = startx;x < endx;)
{
r_fb.screentexcoord2f[6] = 0;
r_fb.screentexcoord2f[7] = 0;
+ if(r_fb.fbo)
+ {
+ for (i = 1;i < 8;i += 2)
+ {
+ r_fb.screentexcoord2f[i] += 1 - (float)(viewheight + r_refdef.view.y) / (float)r_fb.screentextureheight;
+ }
+ }
+
// set up a texcoord array for the reduced resolution bloom image
// (which will be additive blended over the screen image)
r_fb.bloomtexcoord2f[0] = 0;
case RENDERPATH_D3D9:
case RENDERPATH_D3D10:
case RENDERPATH_D3D11:
+ for (i = 0;i < 4;i++)
{
- int i;
- for (i = 0;i < 4;i++)
- {
- r_fb.screentexcoord2f[i*2+0] += 0.5f / (float)r_fb.screentexturewidth;
- r_fb.screentexcoord2f[i*2+1] += 0.5f / (float)r_fb.screentextureheight;
- r_fb.bloomtexcoord2f[i*2+0] += 0.5f / (float)r_fb.bloomtexturewidth;
- r_fb.bloomtexcoord2f[i*2+1] += 0.5f / (float)r_fb.bloomtextureheight;
- }
+ r_fb.screentexcoord2f[i*2+0] += 0.5f / (float)r_fb.screentexturewidth;
+ r_fb.screentexcoord2f[i*2+1] += 0.5f / (float)r_fb.screentextureheight;
+ r_fb.bloomtexcoord2f[i*2+0] += 0.5f / (float)r_fb.bloomtexturewidth;
+ r_fb.bloomtexcoord2f[i*2+1] += 0.5f / (float)r_fb.bloomtextureheight;
}
break;
}
- R_Viewport_InitOrtho(&r_fb.bloomviewport, &identitymatrix, r_refdef.view.x, (r_fb.bloomfbo[0] ? r_fb.bloomtextureheight : vid.height) - r_fb.bloomheight - r_refdef.view.y, r_fb.bloomwidth, r_fb.bloomheight, 0, 0, 1, 1, -10, 100, NULL);
+ R_Viewport_InitOrtho(&r_fb.bloomviewport, &identitymatrix, 0, 0, r_fb.bloomwidth, r_fb.bloomheight, 0, 0, 1, 1, -10, 100, NULL);
if (r_fb.fbo)
r_refdef.view.clear = true;
xoffset /= (float)r_fb.bloomtexturewidth;
yoffset /= (float)r_fb.bloomtextureheight;
// compute a texcoord array with the specified x and y offset
- r_fb.offsettexcoord2f[0] = xoffset+0;
- r_fb.offsettexcoord2f[1] = yoffset+(float)r_fb.bloomheight / (float)r_fb.bloomtextureheight;
- r_fb.offsettexcoord2f[2] = xoffset+(float)r_fb.bloomwidth / (float)r_fb.bloomtexturewidth;
- r_fb.offsettexcoord2f[3] = yoffset+(float)r_fb.bloomheight / (float)r_fb.bloomtextureheight;
- r_fb.offsettexcoord2f[4] = xoffset+(float)r_fb.bloomwidth / (float)r_fb.bloomtexturewidth;
- r_fb.offsettexcoord2f[5] = yoffset+0;
- r_fb.offsettexcoord2f[6] = xoffset+0;
- r_fb.offsettexcoord2f[7] = yoffset+0;
+ r_fb.offsettexcoord2f[0] = xoffset+r_fb.bloomtexcoord2f[0];
+ r_fb.offsettexcoord2f[1] = yoffset+r_fb.bloomtexcoord2f[1];
+ r_fb.offsettexcoord2f[2] = xoffset+r_fb.bloomtexcoord2f[2];
+ r_fb.offsettexcoord2f[3] = yoffset+r_fb.bloomtexcoord2f[3];
+ r_fb.offsettexcoord2f[4] = xoffset+r_fb.bloomtexcoord2f[4];
+ r_fb.offsettexcoord2f[5] = yoffset+r_fb.bloomtexcoord2f[5];
+ r_fb.offsettexcoord2f[6] = xoffset+r_fb.bloomtexcoord2f[6];
+ r_fb.offsettexcoord2f[7] = yoffset+r_fb.bloomtexcoord2f[7];
// this r value looks like a 'dot' particle, fading sharply to
// black at the edges
// (probably not realistic but looks good enough)