1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-06-25 00:25:23 +00:00

Fixed animation rendering.

This commit is contained in:
Tim Sarbin 2018-12-09 01:55:53 -05:00
parent 9aa0f43cd8
commit 0ead3f15c8
2 changed files with 37 additions and 22 deletions

View File

@ -27,8 +27,6 @@ namespace OpenDiablo2.Common.Models
public int LastHeight { get; internal set; } public int LastHeight { get; internal set; }
public int LastXOffset { get; internal set; } public int LastXOffset { get; internal set; }
public int LastYOffset { get; internal set; } public int LastYOffset { get; internal set; }
public byte[] PixelData { get; internal set; }
} }
public sealed class MPQDCCDirectionFrame public sealed class MPQDCCDirectionFrame
@ -41,7 +39,7 @@ namespace OpenDiablo2.Common.Models
public int NumberOfCodedBytes { get; private set; } public int NumberOfCodedBytes { get; private set; }
public bool FrameIsBottomUp { get; private set; } public bool FrameIsBottomUp { get; private set; }
public Rectangle Box { get; private set; } public Rectangle Box { get; private set; }
public Cell[] Cells { get; private set; } public Cell[] Cells { get; internal set; }
public byte[] PixelData { get; internal set; } public byte[] PixelData { get; internal set; }
public int HorizontalCellCount { get; private set; } public int HorizontalCellCount { get; private set; }
public int VerticalCellCount { get; private set; } public int VerticalCellCount { get; private set; }
@ -157,6 +155,7 @@ namespace OpenDiablo2.Common.Models
public byte[] PaletteEntries { get; private set; } public byte[] PaletteEntries { get; private set; }
public Rectangle Box { get; private set; } public Rectangle Box { get; private set; }
public Cell[] Cells { get; private set; } public Cell[] Cells { get; private set; }
public byte[] PixelData { get; private set; }
public int HorizontalCellCount { get; private set; } public int HorizontalCellCount { get; private set; }
public int VerticalCellCount { get; private set; } public int VerticalCellCount { get; private set; }
public PixelBufferEntry[] PixelBuffer { get; private set; } public PixelBufferEntry[] PixelBuffer { get; private set; }
@ -287,24 +286,22 @@ namespace OpenDiablo2.Common.Models
{ {
cell.LastWidth = -1; cell.LastWidth = -1;
cell.LastHeight = -1; cell.LastHeight = -1;
cell.PixelData = new byte[cell.Width * cell.Height];
} }
PixelData = new byte[Box.Width * Box.Height];
var frameIndex = -1; var frameIndex = -1;
foreach (var frame in Frames) foreach (var frame in Frames)
{ {
frameIndex++; frameIndex++;
frame.PixelData = new byte[Box.Width * Box.Height]; frame.PixelData = new byte[Box.Width * Box.Height];
var c = -1; var c = -1;
foreach (var cell in frame.Cells) foreach (var cell in frame.Cells)
{ {
c++; c++;
if (cell.PixelData == null)
cell.PixelData = new byte[cell.Width * cell.Height];
var cellX = cell.XOffset / 4; var cellX = cell.XOffset / 4;
var cellY = cell.YOffset / 4; var cellY = cell.YOffset / 4;
var cellIndex = cellX + (cellY * HorizontalCellCount); var cellIndex = cellX + (cellY * HorizontalCellCount);
@ -318,7 +315,13 @@ namespace OpenDiablo2.Common.Models
{ {
// Different sizes // Different sizes
/// TODO: Clear the pixels of the frame cell /// TODO: Clear the pixels of the frame cell
cell.PixelData = new byte[cell.Width * cell.Height]; for (int y = 0; y < cell.Height; y++)
{
for (int x = 0; x < cell.Width; x++)
{
PixelData[x + cell.XOffset + ((y + cell.YOffset) * frame.Width)] = 0;
}
}
} }
else else
{ {
@ -329,25 +332,25 @@ namespace OpenDiablo2.Common.Models
{ {
for (var fx = 0; fx < cell.Width; fx++) for (var fx = 0; fx < cell.Width; fx++)
{ {
// Frame (buff.lastx, buff.lasty) -> Frame (cell.offx, cell.offy)
// Cell (0, 0,) ->
// blit(dir->bmp, dir->bmp, buff_cell->last_x0, buff_cell->last_y0, cell->x0, cell->y0, cell->w, cell->h ); // blit(dir->bmp, dir->bmp, buff_cell->last_x0, buff_cell->last_y0, cell->x0, cell->y0, cell->w, cell->h );
frame.PixelData[fx + cell.XOffset + ((fy + cell.YOffset) * Box.Width)] PixelData[fx + cell.XOffset + ((fy + cell.YOffset) * Box.Width)]
= frame.PixelData[fx + bufferCell.LastXOffset + ((fy + bufferCell.LastYOffset) * Box.Width)]; = PixelData[fx + bufferCell.LastXOffset + ((fy + bufferCell.LastYOffset) * Box.Width)];
} }
} }
//// Copy it again into the final frame image // Copy it again into the final frame image
for (var fy = 0; fy < cell.Height; fy++) for (var fy = 0; fy < cell.Height; fy++)
{ {
for (var fx = 0; fx < cell.Width; fx++) for (var fx = 0; fx < cell.Width; fx++)
{ {
// blit(cell->bmp, frm_bmp, 0, 0, cell->x0, cell->y0, cell->w, cell->h ); // blit(cell->bmp, frm_bmp, 0, 0, cell->x0, cell->y0, cell->w, cell->h );
frame.PixelData[fx + cell.XOffset + ((fy + cell.YOffset) * Box.Width)] frame.PixelData[fx + cell.XOffset + ((fy + cell.YOffset) * Box.Width)]
= cell.PixelData[fx + (fy * cell.Width)]; = PixelData[cell.XOffset + fx + ((cell.YOffset + fy) * Box.Width)];
} }
} }
} }
} }
else else
@ -355,7 +358,14 @@ namespace OpenDiablo2.Common.Models
if (pbe.Value[0] == pbe.Value[1]) if (pbe.Value[0] == pbe.Value[1])
{ {
// Clear the frame // Clear the frame
cell.PixelData = new byte[cell.Width * cell.Height]; //cell.PixelData = new byte[cell.Width * cell.Height];
for (var y = 0; y < cell.Height; y++)
{
for (var x = 0; x < cell.Width; x++)
{
PixelData[x + cell.XOffset + ((y + cell.YOffset) * Box.Width)] = pbe.Value[0];
}
}
} }
else else
{ {
@ -367,7 +377,7 @@ namespace OpenDiablo2.Common.Models
for (var x = 0; x < cell.Width; x++) for (var x = 0; x < cell.Width; x++)
{ {
var paletteIndex = pcd.GetBits(bitsToRead); var paletteIndex = pcd.GetBits(bitsToRead);
cell.PixelData[x + (y * cell.Width)] = pbe.Value[paletteIndex]; PixelData[x + cell.XOffset + ((y + cell.YOffset) * Box.Width)] = pbe.Value[paletteIndex];
} }
} }
} }
@ -379,7 +389,7 @@ namespace OpenDiablo2.Common.Models
{ {
//blit(cell->bmp, frm_bmp, 0, 0, cell->x0, cell->y0, cell->w, cell->h ); //blit(cell->bmp, frm_bmp, 0, 0, cell->x0, cell->y0, cell->w, cell->h );
frame.PixelData[fx + cell.XOffset + ((fy + cell.YOffset) * Box.Width)] frame.PixelData[fx + cell.XOffset + ((fy + cell.YOffset) * Box.Width)]
= cell.PixelData[fx + (fy * cell.Width)]; = PixelData[fx + cell.XOffset + ((fy + cell.YOffset) * Box.Width)];
} }
} }
pbIdx++; pbIdx++;
@ -391,7 +401,13 @@ namespace OpenDiablo2.Common.Models
bufferCell.LastXOffset = cell.XOffset; bufferCell.LastXOffset = cell.XOffset;
bufferCell.LastYOffset = cell.YOffset; bufferCell.LastYOffset = cell.YOffset;
} }
// Free up the stuff we no longer need
frame.Cells = null;
} }
Cells = null;
PixelData = null;
} }
private static readonly int[] pixelMaskLookup = new int[] { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; private static readonly int[] pixelMaskLookup = new int[] { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 };
@ -509,12 +525,11 @@ namespace OpenDiablo2.Common.Models
// Convert the palette entry index into actual palette entries // Convert the palette entry index into actual palette entries
for (var i = 0; i < pbIndex; i++) for (var i = 0; i <= pbIndex; i++)
{ {
for (var x = 0; x < 4; x++) for (var x = 0; x < 4; x++)
{ {
var y = PixelBuffer[i].Value[x]; PixelBuffer[i].Value[x] = PaletteEntries[PixelBuffer[i].Value[x]];
PixelBuffer[i].Value[x] = PaletteEntries[y];
} }
} }
} }

View File

@ -129,7 +129,6 @@ namespace OpenDiablo2.SDL2_
if (currentDirectionCache != null) if (currentDirectionCache != null)
{ {
currentDirectionCache.RenderFrameIndex = 0; currentDirectionCache.RenderFrameIndex = 0;
seconds = 0f;
return; return;
} }
@ -186,7 +185,7 @@ namespace OpenDiablo2.SDL2_
directionCache.SpriteTexture = new IntPtr[directionCache.FramesToAnimate]; directionCache.SpriteTexture = new IntPtr[directionCache.FramesToAnimate];
directionCache.SpriteRect = new SDL.SDL_Rect[directionCache.FramesToAnimate]; directionCache.SpriteRect = new SDL.SDL_Rect[directionCache.FramesToAnimate];
for (var frameIndex = 0; frameIndex < directionCache.FramesToAnimate; frameIndex++) for (var frameIndex = 0; frameIndex < directionCache.FramesToAnimate; frameIndex++)
{ {
var texture = SDL.SDL_CreateTexture(renderer, SDL.SDL_PIXELFORMAT_ARGB8888, (int)SDL.SDL_TextureAccess.SDL_TEXTUREACCESS_STREAMING, frameW, frameH); var texture = SDL.SDL_CreateTexture(renderer, SDL.SDL_PIXELFORMAT_ARGB8888, (int)SDL.SDL_TextureAccess.SDL_TEXTUREACCESS_STREAMING, frameW, frameH);
@ -202,6 +201,7 @@ namespace OpenDiablo2.SDL2_
var direction = layer.Directions[directionConversion[LocationDetails.MovementDirection]]; var direction = layer.Directions[directionConversion[LocationDetails.MovementDirection]];
var frame = direction.Frames[frameIndex]; var frame = direction.Frames[frameIndex];
for (var y = 0; y < direction.Box.Height; y++) for (var y = 0; y < direction.Box.Height; y++)
{ {
for (var x = 0; x < direction.Box.Width; x++) for (var x = 0; x < direction.Box.Width; x++)