diff --git a/src/animation.c b/src/animation.c index 54f90fb..cce244b 100644 --- a/src/animation.c +++ b/src/animation.c @@ -104,7 +104,7 @@ static unsigned int loadFrame(const char *path) { int r0 = (int)floor(pr1 + HELI_PRECISION); pr1 -= r0; int r1 = r0 + 1; - if (r1 >= w) r1 = w - 1; + if (r1 >= h) r1 = h - 1; if (r0 > r1) r0 = r1; double pr0 = 1 - pr1; diff --git a/src/font.c b/src/font.c index aced0b1..e04c0fa 100644 --- a/src/font.c +++ b/src/font.c @@ -96,20 +96,24 @@ static HeliFontMap* createFontMap() { glGenTextures(1, &map->texid); glBindTexture(GL_TEXTURE_2D, map->texid); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, -0.7f); - char *buffer = calloc(1, FONT_MAP_TEXSIZE*FONT_MAP_TEXSIZE); - int level = 0; - for(int size = FONT_MAP_TEXSIZE, border = FONT_MAP_BORDERSIZE; border > 0; border >>= 1, size >>= 1, ++level) + unsigned char *buffer = (unsigned char*)calloc(1, FONT_MAP_TEXSIZE*FONT_MAP_TEXSIZE); + for(int level = 0, size = FONT_MAP_TEXSIZE; size > 0; ++level, size >>= 1) glTexImage2D(GL_TEXTURE_2D, level, GL_ALPHA, size, size, 0, GL_ALPHA, GL_UNSIGNED_BYTE, buffer); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, level - 1); free(buffer); - glBindTexture(GL_TEXTURE_2D, 0); + int maxLevel = 0; + for(int border = FONT_MAP_BORDERSIZE; border > 0; border >>= 1) ++maxLevel; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, maxLevel - 1); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, maxLevel - 1); + + glBindTexture(GL_TEXTURE_2D, 0); return map; } @@ -147,7 +151,7 @@ static HeliGlyph* loadGlyph(HeliFontInstance *fi, int code) { g->b = (-metrics->horiBearingY + metrics->height)*ftkf; g->advance = metrics->horiAdvance*ftkf; - unsigned char buffer[FONT_MAP_GLYPHSIZE * FONT_MAP_GLYPHSIZE] = {}; + unsigned char buffer[FONT_MAP_GLYPHSIZE*FONT_MAP_GLYPHSIZE] = {}; if (metrics->width > 0 && metrics->height > 0) { FT_Matrix matrix = {}; matrix.xx = (FONT_MAP_GLYPHWORKSIZE-2)*64*65536/metrics->width; @@ -157,7 +161,7 @@ static HeliGlyph* loadGlyph(HeliFontInstance *fi, int code) { offset.y = -(64 + metrics->horiBearingY - metrics->height); FT_Set_Transform(fi->face, &matrix, &offset); int success = !FT_Load_Glyph(fi->face, index, FT_LOAD_NO_HINTING) - && !FT_Render_Glyph(fi->face->glyph, FT_RENDER_MODE_NORMAL); + && !FT_Render_Glyph(fi->face->glyph, FT_RENDER_MODE_NORMAL); FT_Set_Transform(fi->face, NULL, NULL); if (!success) return &blankGlyph; @@ -177,6 +181,8 @@ static HeliGlyph* loadGlyph(HeliFontInstance *fi, int code) { buffer[r*FONT_MAP_GLYPHSIZE + c] = *(bitmap->buffer + bitmap->pitch*(r + dr) + c + dc); } + unsigned int prevtex = 0; + glGetIntegerv(GL_TEXTURE_BINDING_2D, (int*)&prevtex); glBindTexture(GL_TEXTURE_2D, g->map->texid); int gi = g - g->map->glyphs; int r = gi/FONT_MAP_CNT; @@ -204,7 +210,7 @@ static HeliGlyph* loadGlyph(HeliFontInstance *fi, int code) { + (unsigned int)buffer[((r*2 + 1)*size + c)*2 + 1] + 2) >> 2 ); } } - glBindTexture(GL_TEXTURE_2D, 0); + glBindTexture(GL_TEXTURE_2D, prevtex); g->fi = fi; g->code = code; diff --git a/src/geometry.c b/src/geometry.c index 6dc5391..eb2c291 100644 --- a/src/geometry.c +++ b/src/geometry.c @@ -109,8 +109,8 @@ double heliGLGetAAResolution() { glGetIntegerv(GL_VIEWPORT, rect); double w = rect[2], h = rect[3]; - double m00 = fullinv[0]*k*2/w, m01 = fullinv[2]*k/2*w, - m10 = fullinv[4]*k*2/h, m11 = fullinv[5]*k/2*h; + double m00 = fullinv[0]*k*2/w, m01 = fullinv[1]*k*2/w, + m10 = fullinv[4]*k*2/h, m11 = fullinv[5]*k*2/h; double l0 = sqrt(m00*m00 + m01*m01); double l1 = sqrt(m10*m10 + m11*m11); if (l0 > l1) { double l = l0; l0 = l1; l1 = l; } diff --git a/src/group.c b/src/group.c index ca811be..f040286 100644 --- a/src/group.c +++ b/src/group.c @@ -55,7 +55,7 @@ void groupAdd(Group group, Sprite sprite) { if (!sprite) return; if (groupContains(group, sprite)) return; heliArrayInsert(&group->sprites, -1, sprite, NULL); - heliArrayInsert(heliSpriteGetGroups(sprite), -1, sprite, NULL); + heliArrayInsert(heliSpriteGetGroups(sprite), -1, group, NULL); } void groupRemove(Group group, Sprite sprite) { @@ -169,7 +169,7 @@ static void foreachString(Group group, const char *value, HeliSpriteEashString f void groupDestroyTimerEach(Group group, double lifetime) - { foreachDouble(group, lifetime, &spriteDestroyTimer); } + { for(int i = groupGetCount(group) - 1; i >= 0; --i) spriteDestroyTimer(groupGet(group, i), lifetime); } void groupSetVisibleEach(Group group, int visible) { foreachInt(group, visible, &spriteSetVisible); } diff --git a/src/sprite.c b/src/sprite.c index ecb437f..b36257e 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -126,12 +126,13 @@ void spriteDestroy(Sprite sprite) { spriteSetNoAnimation(sprite); while(sprite->groups.count > 0) groupRemove((Group)sprite->groups.items[0].value, sprite); - for(int i = 0; i < sprites.count; ++i) + for(int i = sprites.count - 1; i >= 0; --i) if (sprites.items[i].value == sprite) - { heliArrayRemove(&sprites, i); break; } - for(int i = 0; i < spritesSorted.count; ++i) + heliArrayRemove(&sprites, i); + for(int i = spritesSorted.count - 1; i >= 0; --i) if (spritesSorted.items[i].value == sprite) - { heliArrayRemove(&spritesSorted, i); break; } + heliArrayRemove(&spritesSorted, i); + heliArrayDestroy(&sprite->groups); heliObjectUnregister(sprite); free(sprite); } diff --git a/win/build-win.sh b/win/build-win.sh index 350e12a..0501904 100755 --- a/win/build-win.sh +++ b/win/build-win.sh @@ -247,6 +247,8 @@ function build_demo() { mkdir -p ../../release/demo cp demo.exe ../../release/demo/demo$bits.exe cp -r ../../../demo/data ../../release/demo/ + mkdir -p ../../release/doc/ + cp -r ../../../doc/ru ../../release/doc/ } diff --git a/win/rebuild-heli-win.sh b/win/rebuild-heli-win.sh new file mode 100755 index 0000000..7031d64 --- /dev/null +++ b/win/rebuild-heli-win.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +set -e + +rm -f build*/helianthus.done build*/demo.done + +./build-win.sh