Fixed #93.
This commit is contained in:
parent
ba8adaac51
commit
e4b83484db
@ -1269,7 +1269,7 @@ namespace spades {
|
||||
// Well done!
|
||||
renderer->FrameDone();
|
||||
|
||||
Handle<Bitmap> bmp = renderer->ReadBitmap();
|
||||
Handle<Bitmap> bmp(renderer->ReadBitmap(), false);
|
||||
// force 100% opacity
|
||||
|
||||
uint32_t *pixels = bmp->GetPixels();
|
||||
|
@ -44,6 +44,9 @@ namespace spades {
|
||||
additive = false;
|
||||
blockHitAction = Delete;
|
||||
|
||||
if(image != NULL)
|
||||
image->AddRef();
|
||||
|
||||
renderer = cli->GetRenderer();
|
||||
if(cli->GetWorld())
|
||||
map = cli->GetWorld()->GetMap();
|
||||
@ -51,6 +54,12 @@ namespace spades {
|
||||
map = NULL;
|
||||
}
|
||||
|
||||
ParticleSpriteEntity::~ParticleSpriteEntity() {
|
||||
if(image != NULL){
|
||||
image->Release();
|
||||
}
|
||||
}
|
||||
|
||||
void ParticleSpriteEntity::SetLifeTime(float lifeTime,
|
||||
float fadeIn,
|
||||
float fadeOut){
|
||||
@ -162,8 +171,10 @@ namespace spades {
|
||||
}
|
||||
void ParticleSpriteEntity::SetImage(IImage *img) {
|
||||
if(img == image) return;
|
||||
if(image != NULL)
|
||||
image->Release();
|
||||
image = img;
|
||||
if(image != NULL)
|
||||
image->AddRef();
|
||||
}
|
||||
}
|
||||
|
@ -57,7 +57,7 @@ namespace spades {
|
||||
public:
|
||||
ParticleSpriteEntity(Client *cli, IImage *image, Vector4 color);
|
||||
|
||||
virtual ~ParticleSpriteEntity(){}
|
||||
virtual ~ParticleSpriteEntity();
|
||||
|
||||
virtual bool Update(float dt);
|
||||
virtual void Render3D();
|
||||
|
@ -61,7 +61,7 @@ namespace spades {
|
||||
|
||||
Handle<Bitmap> bmp;
|
||||
try{
|
||||
bmp = new Bitmap(width, height);
|
||||
bmp.Set(new Bitmap(width, height), false);
|
||||
}catch(...){
|
||||
delete img;
|
||||
throw;
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
#include "RefCountedObject.h"
|
||||
#include "../ScriptBindings/ScriptManager.h"
|
||||
#include "Exception.h"
|
||||
|
||||
namespace spades {
|
||||
RefCountedObject::RefCountedObject() {
|
||||
@ -35,7 +36,10 @@ namespace spades {
|
||||
}
|
||||
|
||||
void RefCountedObject::Release() {
|
||||
if(asAtomicInc(refCount) <= 0)
|
||||
int cnt = asAtomicDec(refCount);
|
||||
if(cnt == 0)
|
||||
delete this;
|
||||
else if(cnt < 0)
|
||||
SPRaise("Attempted to release already destroyed object");
|
||||
}
|
||||
}
|
||||
|
@ -39,7 +39,7 @@ namespace spades {
|
||||
class Handle {
|
||||
T *ptr;
|
||||
public:
|
||||
Handle(T *ptr, bool add = false):ptr(ptr) {
|
||||
Handle(T *ptr, bool add = true):ptr(ptr) {
|
||||
if(ptr && add)
|
||||
ptr->AddRef();
|
||||
}
|
||||
@ -68,7 +68,7 @@ namespace spades {
|
||||
SPAssert(ptr != NULL);
|
||||
return *ptr;
|
||||
}
|
||||
void Set(T *p, bool add = false) {
|
||||
void Set(T *p, bool add = true) {
|
||||
if(p == ptr){
|
||||
if(!add)
|
||||
ptr->Release();
|
||||
|
@ -37,7 +37,7 @@ namespace spades {
|
||||
for(int i = 0; i < chunkRows * chunkCols; i++)
|
||||
chunkInvalid.push_back(false);
|
||||
|
||||
Handle<Bitmap> bmp = GenerateBitmap(0, 0, m->Width(), m->Height());
|
||||
Handle<Bitmap> bmp(GenerateBitmap(0, 0, m->Width(), m->Height()), false);
|
||||
try{
|
||||
image = static_cast<GLImage *>(renderer->CreateImage(bmp));
|
||||
}catch(...){
|
||||
@ -61,7 +61,7 @@ namespace spades {
|
||||
|
||||
Bitmap *GLFlatMapRenderer::GenerateBitmap(int mx, int my, int w, int h){
|
||||
SPADES_MARK_FUNCTION();
|
||||
Handle<Bitmap> bmp = new Bitmap(w, h);
|
||||
Handle<Bitmap> bmp(new Bitmap(w, h), false);
|
||||
try{
|
||||
uint32_t *pixels = bmp->GetPixels();
|
||||
|
||||
@ -112,9 +112,9 @@ namespace spades {
|
||||
int chunkX = ((int)i) % chunkCols;
|
||||
int chunkY = ((int)i) / chunkCols;
|
||||
|
||||
Handle<Bitmap> bmp = GenerateBitmap(chunkX * ChunkSize,
|
||||
Handle<Bitmap> bmp(GenerateBitmap(chunkX * ChunkSize,
|
||||
chunkY * ChunkSize,
|
||||
ChunkSize, ChunkSize);
|
||||
ChunkSize, ChunkSize), false);
|
||||
try{
|
||||
image->SubImage(bmp, chunkX * ChunkSize, chunkY * ChunkSize);
|
||||
}catch(...){
|
||||
|
@ -63,6 +63,10 @@ namespace spades{
|
||||
}
|
||||
|
||||
GLImageRenderer::~GLImageRenderer(){
|
||||
if(image != NULL){
|
||||
image->Release();
|
||||
image = NULL;
|
||||
}
|
||||
delete positionAttribute;
|
||||
delete colorAttribute;
|
||||
delete textureCoordAttribute;
|
||||
@ -117,6 +121,8 @@ namespace spades{
|
||||
|
||||
vertices.clear();
|
||||
indices.clear();
|
||||
image->Release();
|
||||
image = NULL;
|
||||
}
|
||||
|
||||
void GLImageRenderer::SetImage(spades::draw::GLImage *img){
|
||||
@ -124,6 +130,7 @@ namespace spades{
|
||||
return;
|
||||
Flush();
|
||||
image = img;
|
||||
image->AddRef();
|
||||
}
|
||||
|
||||
void GLImageRenderer::Add(float dx1, float dy1,
|
||||
|
@ -32,8 +32,8 @@ namespace spades {
|
||||
}
|
||||
|
||||
GLModelRenderer::~GLModelRenderer() {
|
||||
|
||||
SPADES_MARK_FUNCTION();
|
||||
Clear();
|
||||
}
|
||||
|
||||
void GLModelRenderer::AddModel(GLModel *model,
|
||||
@ -43,6 +43,7 @@ namespace spades {
|
||||
model->renderId = (int)models.size();
|
||||
RenderModel m;
|
||||
m.model = model;
|
||||
model->AddRef();
|
||||
models.push_back(m);
|
||||
}
|
||||
modelCount++;
|
||||
@ -108,6 +109,7 @@ namespace spades {
|
||||
// last phase: clear scene
|
||||
for(size_t i = 0; i < models.size(); i++){
|
||||
models[i].model->renderId = -1;
|
||||
models[i].model->Release();
|
||||
}
|
||||
models.clear();
|
||||
|
||||
|
@ -113,7 +113,7 @@ namespace spades {
|
||||
}
|
||||
|
||||
BitmapAtlasGenerator::Result result = atlasGen.Pack();
|
||||
Handle<Bitmap> bmp = result.bitmap;
|
||||
Handle<Bitmap> bmp(result.bitmap, false);
|
||||
SPAssert(result.items.size() == bmps.size());
|
||||
for(size_t i = 0; i < bmps.size(); i++){
|
||||
bmps[i]->Release();
|
||||
|
@ -905,14 +905,14 @@ namespace spades {
|
||||
device->BindFramebuffer(IGLDevice::Framebuffer, 0);
|
||||
device->Enable(IGLDevice::Blend, false);
|
||||
device->Viewport(0, 0, handle.GetWidth(), handle.GetHeight());
|
||||
Handle<GLImage> image = new GLImage(handle.GetTexture(),
|
||||
Handle<GLImage> image(new GLImage(handle.GetTexture(),
|
||||
device,
|
||||
handle.GetWidth(),
|
||||
handle.GetHeight(),
|
||||
false);
|
||||
false), false);
|
||||
SetColor(MakeVector4(1, 1, 1, 1));
|
||||
DrawImage(image, AABB2(0,handle.GetHeight(),handle.GetWidth(),-handle.GetHeight()));
|
||||
imageRenderer->Flush(); // must flush now because handle is released soon
|
||||
imageRenderer->Flush();
|
||||
}
|
||||
|
||||
handle.Release();
|
||||
@ -1093,10 +1093,10 @@ namespace spades {
|
||||
device->BindFramebuffer(IGLDevice::Framebuffer, 0);
|
||||
device->Enable(IGLDevice::Blend, false);
|
||||
device->Viewport(0, 0, w,h);
|
||||
Handle<GLImage> image = new GLImage(lastColorBufferTexture,
|
||||
Handle<GLImage> image(new GLImage(lastColorBufferTexture,
|
||||
device,
|
||||
w,h,
|
||||
false);
|
||||
false), false);
|
||||
SetColor(MakeVector4(1, 1, 1, 1));
|
||||
DrawImage(image, AABB2(0,h,w,-h));
|
||||
imageRenderer->Flush(); // must flush now because handle is released soon
|
||||
|
@ -260,12 +260,11 @@ namespace spades {
|
||||
|
||||
{
|
||||
SDLGLDevice glDevice(surface);
|
||||
Handle<draw::GLRenderer> renderer = new draw::GLRenderer(&glDevice);
|
||||
Handle<draw::GLRenderer> renderer(new draw::GLRenderer(&glDevice), false);
|
||||
audio::ALDevice audio;
|
||||
|
||||
RunClientLoop(renderer, &audio);
|
||||
|
||||
renderer->Shutdown();
|
||||
}
|
||||
}catch(...){
|
||||
SDL_Quit();
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
#include "ScriptManager.h"
|
||||
#include <Client/IAudioDevice.h>
|
||||
#include <Client/IAudioChunk.h>
|
||||
|
||||
namespace spades {
|
||||
namespace client{
|
||||
@ -32,7 +33,9 @@ namespace spades {
|
||||
}
|
||||
static IAudioChunk *RegisterSound(const std::string& name, IAudioDevice *dev) {
|
||||
try{
|
||||
return dev->RegisterSound(name.c_str());
|
||||
IAudioChunk *c = dev->RegisterSound(name.c_str());
|
||||
c->AddRef();
|
||||
return c;
|
||||
}catch(const std::exception& ex) {
|
||||
ScriptContextUtils().SetNativeException(ex);
|
||||
return NULL;
|
||||
|
@ -31,7 +31,9 @@ namespace spades {
|
||||
static IModel *RegisterModel(const std::string& str,
|
||||
IRenderer *r) {
|
||||
try{
|
||||
return r->RegisterModel(str.c_str());
|
||||
IModel *m = r->RegisterModel(str.c_str());
|
||||
m->AddRef();
|
||||
return m;
|
||||
}catch(const std::exception& ex) {
|
||||
ScriptContextUtils().SetNativeException(ex);
|
||||
return NULL;
|
||||
@ -40,7 +42,9 @@ namespace spades {
|
||||
static IImage *RegisterImage(const std::string& str,
|
||||
IRenderer *r) {
|
||||
try{
|
||||
return r->RegisterImage(str.c_str());
|
||||
IImage *im = r->RegisterImage(str.c_str());
|
||||
im->AddRef();
|
||||
return im;
|
||||
}catch(const std::exception& ex) {
|
||||
ScriptContextUtils().SetNativeException(ex);
|
||||
return NULL;
|
||||
|
Loading…
x
Reference in New Issue
Block a user