mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-02-01 03:15:32 +00:00
Added 2D rendring component with SDL backend.
This commit is contained in:
parent
2139bb78af
commit
7583fc3f1b
13 changed files with 518 additions and 0 deletions
61
rend2d/driver.hpp
Normal file
61
rend2d/driver.hpp
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
#ifndef MANGLE_REND2D_DRIVER_H
|
||||||
|
#define MANGLE_REND2D_DRIVER_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "sprite.hpp"
|
||||||
|
|
||||||
|
namespace Mangle
|
||||||
|
{
|
||||||
|
namespace Rend2D
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
The driver is the connection to the backend system that powers
|
||||||
|
2D sprite rendering. For example the backend could be SDL or
|
||||||
|
any other 2D-capable graphics library.
|
||||||
|
*/
|
||||||
|
struct Driver
|
||||||
|
{
|
||||||
|
/// Get the screen sprite
|
||||||
|
virtual Sprite *getScreen() = 0;
|
||||||
|
|
||||||
|
/// Sets the video mode.
|
||||||
|
virtual void setVideoMode(int width, int height, int bpp=32, bool fullscreen=false) = 0;
|
||||||
|
|
||||||
|
/** Update the screen. Until this function is called, none of
|
||||||
|
the changes written to the screen sprite will be visible.
|
||||||
|
*/
|
||||||
|
virtual void update() = 0;
|
||||||
|
|
||||||
|
/// Set the window title, as well as the title of the window
|
||||||
|
/// when "iconified"
|
||||||
|
virtual void setWindowTitle(const std::string &title,
|
||||||
|
const std::string &icon) = 0;
|
||||||
|
|
||||||
|
/// Set the window title
|
||||||
|
void setWindowTitle(const std::string &title) { setWindowTitle(title,title); }
|
||||||
|
|
||||||
|
/// Load sprite from an image file
|
||||||
|
virtual Sprite* loadImage(const std::string &file) = 0;
|
||||||
|
|
||||||
|
/// Load a sprite from an image file stored in memory.
|
||||||
|
virtual Sprite* loadImage(const void* data, size_t size) = 0;
|
||||||
|
|
||||||
|
/** @brief Set gamma value for all colors.
|
||||||
|
|
||||||
|
Note: Setting this in windowed mode will affect the ENTIRE
|
||||||
|
SCREEN!
|
||||||
|
*/
|
||||||
|
virtual void setGamma(float gamma) = 0;
|
||||||
|
|
||||||
|
/// Set gamma individually for red, green, blue
|
||||||
|
virtual void setGamma(float red, float green, float blue) = 0;
|
||||||
|
|
||||||
|
/// Get screen width
|
||||||
|
virtual int width() = 0;
|
||||||
|
|
||||||
|
/// Get screen height
|
||||||
|
virtual int height() = 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
199
rend2d/servers/sdl_driver.cpp
Normal file
199
rend2d/servers/sdl_driver.cpp
Normal file
|
@ -0,0 +1,199 @@
|
||||||
|
#include "sdl_driver.hpp"
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
#include <SDL_image.h>
|
||||||
|
#include "../../tools/str_exception.hpp"
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
using namespace Mangle::Rend2D;
|
||||||
|
|
||||||
|
void SDL_Sprite::draw(Sprite *s, // Must be SDL_Sprite
|
||||||
|
int x, int y, // Destination position
|
||||||
|
int sx, int sy, // Source position
|
||||||
|
int w, int h // Amount to draw. -1 means remainder.
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Get source surface
|
||||||
|
SDL_Sprite *other = dynamic_cast<SDL_Sprite*>(s);
|
||||||
|
assert(other != NULL);
|
||||||
|
SDL_Surface *img = other->getSurface();
|
||||||
|
|
||||||
|
// Check coordinate validity
|
||||||
|
assert(sx <= img->w && sy <= img->h);
|
||||||
|
assert(x <= surface->w && y <= surface->h);
|
||||||
|
assert(sx >= 0 && sy >= 0);
|
||||||
|
|
||||||
|
// Compute width and height if necessary
|
||||||
|
if(w == -1) w = img->w - sx;
|
||||||
|
if(h == -1) h = img->h - sy;
|
||||||
|
|
||||||
|
// Check them if they're valid
|
||||||
|
assert(w >= 0 && w <= img->w);
|
||||||
|
assert(h >= 0 && h <= img->h);
|
||||||
|
|
||||||
|
SDL_Rect dest;
|
||||||
|
dest.x = x;
|
||||||
|
dest.y = y;
|
||||||
|
dest.w = w;
|
||||||
|
dest.h = h;
|
||||||
|
|
||||||
|
SDL_Rect src;
|
||||||
|
src.x = sx;
|
||||||
|
src.y = sy;
|
||||||
|
src.w = w;
|
||||||
|
src.h = h;
|
||||||
|
|
||||||
|
// Do the Blitman
|
||||||
|
SDL_BlitSurface(img, &src, surface, &dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Sprite::SDL_Sprite(SDL_Surface *s, bool autoDelete)
|
||||||
|
: surface(s), autoDel(autoDelete)
|
||||||
|
{
|
||||||
|
assert(surface != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Sprite::~SDL_Sprite()
|
||||||
|
{
|
||||||
|
if(autoDel)
|
||||||
|
SDL_FreeSurface(surface);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDL_Sprite::fill(int value)
|
||||||
|
{
|
||||||
|
SDL_FillRect(surface, NULL, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
int SDL_Sprite::width() { return surface->w; }
|
||||||
|
int SDL_Sprite::height() { return surface->h; }
|
||||||
|
|
||||||
|
SDLDriver::SDLDriver() : display(NULL), realDisp(NULL), softDouble(false)
|
||||||
|
{
|
||||||
|
if (SDL_InitSubSystem( SDL_INIT_VIDEO ) == -1)
|
||||||
|
throw str_exception("Error initializing SDL video");
|
||||||
|
}
|
||||||
|
SDLDriver::~SDLDriver()
|
||||||
|
{
|
||||||
|
if(display) delete display;
|
||||||
|
SDL_Quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLDriver::setVideoMode(int width, int height, int bpp, bool fullscreen)
|
||||||
|
{
|
||||||
|
unsigned int flags;
|
||||||
|
|
||||||
|
if(display) delete display;
|
||||||
|
|
||||||
|
if (fullscreen)
|
||||||
|
// Assume fullscreen mode allows a double-bufferd hardware
|
||||||
|
// mode. We need more test code for this to be safe though.
|
||||||
|
flags = SDL_FULLSCREEN | SDL_HWSURFACE | SDL_DOUBLEBUF;
|
||||||
|
else
|
||||||
|
flags = SDL_SWSURFACE;
|
||||||
|
|
||||||
|
// Create the surface and check it
|
||||||
|
realDisp = SDL_SetVideoMode(width, height, bpp, flags);
|
||||||
|
if(realDisp == NULL)
|
||||||
|
throw str_exception("Failed setting SDL video mode");
|
||||||
|
|
||||||
|
// Code for software double buffering. I haven't found this to be
|
||||||
|
// any speed advantage at all in windowed mode (it's slower, as one
|
||||||
|
// would expect.) Not properly tested in fullscreen mode with
|
||||||
|
// hardware buffers, but it will probably only be an improvement if
|
||||||
|
// we do excessive writing (ie. write each pixel on average more
|
||||||
|
// than once) or try to read from the display buffer.
|
||||||
|
if(softDouble)
|
||||||
|
{
|
||||||
|
// Make a new surface with the same attributes as the real
|
||||||
|
// display surface.
|
||||||
|
SDL_Surface *back = SDL_DisplayFormat(realDisp);
|
||||||
|
assert(back != NULL);
|
||||||
|
|
||||||
|
// Create a sprite representing the double buffer
|
||||||
|
display = new SDL_Sprite(back);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Create a sprite directly representing the display surface.
|
||||||
|
// The 'false' parameter means do not autodelete the screen
|
||||||
|
// surface upon exit (since SDL manages it)
|
||||||
|
display = new SDL_Sprite(realDisp, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Update the screen
|
||||||
|
void SDLDriver::update()
|
||||||
|
{
|
||||||
|
// Blit the soft double buffer onto the real display buffer
|
||||||
|
if(softDouble)
|
||||||
|
SDL_BlitSurface(display->getSurface(), NULL, realDisp, NULL );
|
||||||
|
|
||||||
|
if(realDisp)
|
||||||
|
SDL_Flip(realDisp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set the window title, as well as the title of the window when
|
||||||
|
/// "iconified"
|
||||||
|
void SDLDriver::setWindowTitle(const std::string &title,
|
||||||
|
const std::string &icon)
|
||||||
|
{
|
||||||
|
SDL_WM_SetCaption( title.c_str(), icon.c_str() );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert the given surface to display format.
|
||||||
|
static SDL_Surface* convertImage(SDL_Surface* surf)
|
||||||
|
{
|
||||||
|
if(surf != NULL)
|
||||||
|
{
|
||||||
|
// Convert the image to the display buffer format, for faster
|
||||||
|
// blitting
|
||||||
|
SDL_Surface *surf2 = SDL_DisplayFormat(surf);
|
||||||
|
SDL_FreeSurface(surf);
|
||||||
|
surf = surf2;
|
||||||
|
}
|
||||||
|
return surf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Load sprite from an image file, using SDL_image.
|
||||||
|
Sprite* SDLDriver::loadImage(const std::string &file)
|
||||||
|
{
|
||||||
|
SDL_Surface *surf = IMG_Load(file.c_str());
|
||||||
|
surf = convertImage(surf);
|
||||||
|
if(surf == NULL)
|
||||||
|
throw str_exception("SDL failed to load image file '" + file + "'");
|
||||||
|
return spriteFromSDL(surf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Load sprite from an SDL_RWops structure. autoFree determines
|
||||||
|
/// whether the RWops struct should be closed/freed after use.
|
||||||
|
Sprite* SDLDriver::loadImage(SDL_RWops *src, bool autoFree)
|
||||||
|
{
|
||||||
|
SDL_Surface *surf = IMG_Load_RW(src, autoFree);
|
||||||
|
surf = convertImage(surf);
|
||||||
|
if(surf == NULL)
|
||||||
|
throw str_exception("SDL failed to load image");
|
||||||
|
return spriteFromSDL(surf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Load a sprite from an image file stored in memory. Uses
|
||||||
|
/// SDL_image.
|
||||||
|
Sprite* SDLDriver::loadImage(const void* data, size_t size)
|
||||||
|
{
|
||||||
|
SDL_RWops *rw = SDL_RWFromConstMem(data, size);
|
||||||
|
return loadImage(rw, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLDriver::setGamma(float red, float green, float blue)
|
||||||
|
{
|
||||||
|
SDL_SetGamma(red,green,blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Convert an existing SDL surface into a sprite
|
||||||
|
Sprite* SDLDriver::spriteFromSDL(SDL_Surface *surf, bool autoFree)
|
||||||
|
{
|
||||||
|
assert(surf);
|
||||||
|
return new SDL_Sprite(surf, autoFree);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDLDriver::sleep(int ms) { SDL_Delay(ms); }
|
||||||
|
unsigned int SDLDriver::ticks() { return SDL_GetTicks(); }
|
116
rend2d/servers/sdl_driver.hpp
Normal file
116
rend2d/servers/sdl_driver.hpp
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
#ifndef MANGLE_DRAW2D_SDL_H
|
||||||
|
#define MANGLE_DRAW2D_SDL_H
|
||||||
|
|
||||||
|
#include "../driver.hpp"
|
||||||
|
|
||||||
|
// Predeclarations keep the streets safe at night
|
||||||
|
struct SDL_Surface;
|
||||||
|
struct SDL_RWops;
|
||||||
|
|
||||||
|
namespace Mangle
|
||||||
|
{
|
||||||
|
namespace Rend2D
|
||||||
|
{
|
||||||
|
/// SDL-implementation of Sprite
|
||||||
|
struct SDL_Sprite : Sprite
|
||||||
|
{
|
||||||
|
/** Draw a sprite in the given position. Can only draw other SDL
|
||||||
|
sprites.
|
||||||
|
*/
|
||||||
|
void draw(Sprite *s, // Must be SDL_Sprite
|
||||||
|
int x, int y, // Destination position
|
||||||
|
int sx=0, int sy=0, // Source position
|
||||||
|
int w=-1, int h=-1 // Amount to draw. -1 means remainder.
|
||||||
|
);
|
||||||
|
|
||||||
|
SDL_Sprite(SDL_Surface *s, bool autoDelete=true);
|
||||||
|
~SDL_Sprite();
|
||||||
|
|
||||||
|
// Information retrieval
|
||||||
|
int width();
|
||||||
|
int height();
|
||||||
|
SDL_Surface *getSurface() { return surface; }
|
||||||
|
|
||||||
|
// Fill with a given pixel value
|
||||||
|
void fill(int value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// The SDL surface
|
||||||
|
SDL_Surface* surface;
|
||||||
|
|
||||||
|
// If true, delete this surface when the canvas is destructed
|
||||||
|
bool autoDel;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SDLDriver : public Driver
|
||||||
|
{
|
||||||
|
// The main display surface
|
||||||
|
SDL_Sprite *display;
|
||||||
|
|
||||||
|
// The actual display surface. May or may not be the same
|
||||||
|
// surface pointed to by 'display' above, depending on the
|
||||||
|
// softDouble flag.
|
||||||
|
SDL_Surface *realDisp;
|
||||||
|
|
||||||
|
// If true, we do software double buffering.
|
||||||
|
bool softDouble;
|
||||||
|
|
||||||
|
public:
|
||||||
|
SDLDriver();
|
||||||
|
~SDLDriver();
|
||||||
|
|
||||||
|
/// Sets the video mode. Will create the window if it is not
|
||||||
|
/// already set up. Note that for SDL, bpp=0 means use current
|
||||||
|
/// bpp.
|
||||||
|
void setVideoMode(int width, int height, int bpp=0, bool fullscreen=false);
|
||||||
|
|
||||||
|
/// Update the screen
|
||||||
|
void update();
|
||||||
|
|
||||||
|
/// Set the window title, as well as the title of the window
|
||||||
|
/// when "iconified"
|
||||||
|
void setWindowTitle(const std::string &title,
|
||||||
|
const std::string &icon);
|
||||||
|
|
||||||
|
// Include overloads from our Glorious parent
|
||||||
|
using Driver::setWindowTitle;
|
||||||
|
|
||||||
|
/// Load sprite from an image file, using SDL_image.
|
||||||
|
Sprite* loadImage(const std::string &file);
|
||||||
|
|
||||||
|
/// Load sprite from an SDL_RWops structure. autoFree determines
|
||||||
|
/// whether the RWops struct should be closed/freed after use.
|
||||||
|
Sprite* loadImage(SDL_RWops *src, bool autoFree=false);
|
||||||
|
|
||||||
|
/// Load a sprite from an image file stored in memory. Uses
|
||||||
|
/// SDL_image.
|
||||||
|
Sprite* loadImage(const void* data, size_t size);
|
||||||
|
|
||||||
|
/// Set gamma value
|
||||||
|
void setGamma(float gamma) { setGamma(gamma,gamma,gamma); }
|
||||||
|
|
||||||
|
/// Set gamma individually for red, green, blue
|
||||||
|
void setGamma(float red, float green, float blue);
|
||||||
|
|
||||||
|
/// Convert an existing SDL surface into a sprite
|
||||||
|
Sprite* spriteFromSDL(SDL_Surface *surf, bool autoFree = true);
|
||||||
|
|
||||||
|
// Get width and height
|
||||||
|
int width() { return display ? display->width() : 0; }
|
||||||
|
int height() { return display ? display->height() : 0; }
|
||||||
|
|
||||||
|
/// Get the screen sprite
|
||||||
|
Sprite *getScreen() { return display; }
|
||||||
|
|
||||||
|
/// Not really a graphic-related function, but very
|
||||||
|
/// handly. Sleeps the given number of milliseconds using
|
||||||
|
/// SDL_Delay().
|
||||||
|
void sleep(int ms);
|
||||||
|
|
||||||
|
/// Get the number of ticks since SDL initialization, using
|
||||||
|
/// SDL_GetTicks().
|
||||||
|
unsigned int ticks();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
34
rend2d/sprite.hpp
Normal file
34
rend2d/sprite.hpp
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
#ifndef MANGLE_REND2D_SPRITE_H
|
||||||
|
#define MANGLE_REND2D_SPRITE_H
|
||||||
|
|
||||||
|
namespace Mangle
|
||||||
|
{
|
||||||
|
namespace Rend2D
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
A Sprite is either a bitmap to be drawn or an output of area
|
||||||
|
for blitting other bitmaps, or both. They are created by the
|
||||||
|
Driver.
|
||||||
|
*/
|
||||||
|
struct Sprite
|
||||||
|
{
|
||||||
|
/// Draw a sprite in the given position
|
||||||
|
virtual void draw(Sprite *s, // The sprite to draw
|
||||||
|
int x, int y, // Destination position
|
||||||
|
int sx=0, int sy=0, // Source position
|
||||||
|
int w=-1, int h=-1 // Amount to draw. -1 means remainder.
|
||||||
|
) = 0;
|
||||||
|
|
||||||
|
virtual ~Sprite() {}
|
||||||
|
|
||||||
|
// Information retrieval
|
||||||
|
virtual int width() = 0;
|
||||||
|
virtual int height() = 0;
|
||||||
|
|
||||||
|
/// Fill the sprite with the given pixel value. The pixel format
|
||||||
|
/// depends on the format of the sprite.
|
||||||
|
virtual void fill(int value) = 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
1
rend2d/tests/.gitignore
vendored
Normal file
1
rend2d/tests/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
*_test
|
9
rend2d/tests/Makefile
Normal file
9
rend2d/tests/Makefile
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
GCC=g++
|
||||||
|
|
||||||
|
all: sdl_test
|
||||||
|
|
||||||
|
sdl_test: sdl_test.cpp
|
||||||
|
$(GCC) $< ../servers/sdl_driver.cpp -o $@ -I/usr/include/SDL/ -lSDL -lSDL_image
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm *_test
|
11
rend2d/tests/output/sdl_test.out
Normal file
11
rend2d/tests/output/sdl_test.out
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
Loading SDL driver.
|
||||||
|
Creating window.
|
||||||
|
Current mode: 640x480
|
||||||
|
Setting fancy title, cause we like fancy titles.
|
||||||
|
Loading tile1-blue.png from file.
|
||||||
|
Loading tile1-yellow.png from memory.
|
||||||
|
Going bananas.
|
||||||
|
Taking a breather.
|
||||||
|
WOW DID YOU SEE THAT!?
|
||||||
|
Mucking about with the gamma settings
|
||||||
|
Done.
|
65
rend2d/tests/sdl_test.cpp
Normal file
65
rend2d/tests/sdl_test.cpp
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include "../servers/sdl_driver.hpp"
|
||||||
|
|
||||||
|
using namespace Mangle::Rend2D;
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
cout << "Loading SDL driver.\n";
|
||||||
|
SDLDriver sdl;
|
||||||
|
|
||||||
|
cout << "Creating window.\n";
|
||||||
|
sdl.setVideoMode(640,480);
|
||||||
|
cout << "Current mode: " << sdl.width() << "x" << sdl.height() << endl;
|
||||||
|
|
||||||
|
cout << "Setting fancy title, cause we like fancy titles.\n";
|
||||||
|
sdl.setWindowTitle("Chief executive window");
|
||||||
|
|
||||||
|
// Display surface
|
||||||
|
Sprite *screen = sdl.getScreen();
|
||||||
|
|
||||||
|
const char* imgName = "tile1-blue.png";
|
||||||
|
cout << "Loading " << imgName << " from file.\n";
|
||||||
|
Sprite *image = sdl.loadImage(imgName);
|
||||||
|
|
||||||
|
const char* imgName2 = "tile1-yellow.png";
|
||||||
|
cout << "Loading " << imgName2 << " from memory.\n";
|
||||||
|
Sprite *image2;
|
||||||
|
{
|
||||||
|
// This is hard-coded for file sizes below 500 bytes, so obviously
|
||||||
|
// you shouldn't mess with the image files.
|
||||||
|
ifstream file(imgName2, ios::binary);
|
||||||
|
char buf[500];
|
||||||
|
file.read(buf, 500);
|
||||||
|
int size = file.gcount();
|
||||||
|
image2 = sdl.loadImage(buf, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << "Going bananas.\n";
|
||||||
|
for(int i=1; i<20; i++)
|
||||||
|
screen->draw(image, 30*i, 20*i);
|
||||||
|
|
||||||
|
cout << "Taking a breather.\n";
|
||||||
|
sdl.update();
|
||||||
|
for(int i=1; i<20; i++)
|
||||||
|
screen->draw(image2, 30*(20-i), 20*i);
|
||||||
|
sdl.sleep(800);
|
||||||
|
sdl.update();
|
||||||
|
cout << "WOW DID YOU SEE THAT!?\n";
|
||||||
|
sdl.sleep(800);
|
||||||
|
|
||||||
|
cout << "Mucking about with the gamma settings\n";
|
||||||
|
sdl.setGamma(2.0, 0.1, 0.8);
|
||||||
|
sdl.sleep(100);
|
||||||
|
sdl.setGamma(0.6, 2.1, 2.1);
|
||||||
|
sdl.sleep(100);
|
||||||
|
sdl.setGamma(1.6);
|
||||||
|
sdl.sleep(100);
|
||||||
|
|
||||||
|
cout << "Done.\n";
|
||||||
|
return 0;
|
||||||
|
}
|
18
rend2d/tests/test.sh
Executable file
18
rend2d/tests/test.sh
Executable file
|
@ -0,0 +1,18 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
make || exit
|
||||||
|
|
||||||
|
mkdir -p output
|
||||||
|
|
||||||
|
PROGS=*_test
|
||||||
|
|
||||||
|
for a in $PROGS; do
|
||||||
|
if [ -f "output/$a.out" ]; then
|
||||||
|
echo "Running $a:"
|
||||||
|
./$a | diff output/$a.out -
|
||||||
|
else
|
||||||
|
echo "Creating $a.out"
|
||||||
|
./$a > "output/$a.out"
|
||||||
|
git add "output/$a.out"
|
||||||
|
fi
|
||||||
|
done
|
BIN
rend2d/tests/tile1-blue.png
Normal file
BIN
rend2d/tests/tile1-blue.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 273 B |
BIN
rend2d/tests/tile1-yellow.png
Normal file
BIN
rend2d/tests/tile1-yellow.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 257 B |
|
@ -12,4 +12,5 @@ run stream
|
||||||
run vfs
|
run vfs
|
||||||
run sound
|
run sound
|
||||||
run input
|
run input
|
||||||
|
run rend2d
|
||||||
run .
|
run .
|
||||||
|
|
|
@ -37,7 +37,10 @@ class MangleArchive : public Ogre::Archive
|
||||||
time_t getModifiedTime(const Ogre::String& filename)
|
time_t getModifiedTime(const Ogre::String& filename)
|
||||||
{ return vfs->stat(filename)->time; }
|
{ return vfs->stat(filename)->time; }
|
||||||
|
|
||||||
|
// With both these we support both OGRE 1.6 and 1.7
|
||||||
Ogre::DataStreamPtr open(const Ogre::String& filename) const;
|
Ogre::DataStreamPtr open(const Ogre::String& filename) const;
|
||||||
|
Ogre::DataStreamPtr open(const Ogre::String& filename, bool readOnly) const
|
||||||
|
{ return open(filename); }
|
||||||
|
|
||||||
Ogre::StringVectorPtr list(bool recursive = true, bool dirs = false);
|
Ogre::StringVectorPtr list(bool recursive = true, bool dirs = false);
|
||||||
Ogre::FileInfoListPtr listFileInfo(bool recursive = true, bool dirs = false);
|
Ogre::FileInfoListPtr listFileInfo(bool recursive = true, bool dirs = false);
|
||||||
|
|
Loading…
Reference in a new issue