* Add red fairies; tweaks to blue fairies and circles
* Add more fairies and a simple enemy archetype system
Note that existing stages not utilizing the new enemy spawning system
will have a visual regression - fairies will not have their magic
circles and particle effects visible. These are no longer implemented by
the enemy visual rules and require additional setup from the new spawner
wrappers. All stages should be converted to the new system.
Also improved old fairy sprites
* enemy_classes: rebalance HP
* enemy_classes: add EnemySpawner typedef
* items: add ITEMS() shortcut macro for use with enemy spawners
* switch: fix es-shaders being packed before transpilation
* switch: build fixes and glsl debug logs
* switch: fix crash on shutdown
shutdown is now done before __libc_fini_array is called, which avoids
freeing the gl context resources twice (in __libc_fini_array, and in SDL_GL_DeleteContext)
* WIP compressed textures, swizzles, sRGB sampling, ...
* refactor texture type info & fix random bugs
* fix preprocessing of sRGB textures
* handle y-flipped basis textures
* glcommon: better WebGL compat for compressed format detection
* missed WEBGL_compressed_texture_pvrtc
* implement compressed texture xcoding and uploading
* Add basis_universal submodule
* Reorganize texture loader code
Clean up some code
Isolate Basis Universal loader into a separate module
* Add wrapper script for encoding .basis textures
* basisu: honor custom metadata written by the mkbasis.py script
* mkbasis.py: add --incredibly-slow and --dry-run
* Move pixmap code from util/ to pixmap/
* Add an on-disk transcode cache for basis textures to speed up loads
* Compress texture cache with zlib
* Use readable format names for basisu cache filenames
* basisu: mip bias test code
* basisu: small caching cleanup
* add TAISEI_BASISU_MIP_BIAS env variable
* Improve OpenGL format matching heuristics
* Document considerations for compressed format priority
* Remove dead code
* Enable two forgotten formats, BC3_RGBA and ATC_RGBA
Also prefer BC7 over BC1/BC3
* Recognize GL_ANGLE_compressed_texture_etc for ETC2 textures
* Default depth buffers to 24-bit; remove ANGLE hack
* Fix glcommon_check_extension for GLES2/legacy gl
* Add renderer feature bit for texture swizzle masks
* glcommon: Fixup internal formats for GLES2
Sized internal formats are not allowed in GLES2
* Fix emscripten compile errors
* Update basis_universal
* remove more dead code
* revert irrelevant stage4 change
* shut up UBSan
* basisu: shut up some debug spam
* Add normalmap sampling helper to util.glslh
* basisu: add a gray-alpha mode
* mkbasis.py: Abort if image dimansions aren't multiples of 4
* Add basic Basis Universal encoding documentation (WIP)
* doc/basisu: Add paragraph about modes; minor tweaks
* basisu: workarounds for GL texture size requirements
* gles20: fix uncompressed sRGB formats
* Partial workaround for missing swizzles in gles2 and webgl
* remove invalid assertion
* New renderer API to expose glDrawBuffers-like functionality
* stagedraw: disable all color outputs for copy_depth pass
required for WebGL compatibility
* support GL_ANGLE_request_extension
* emscripten: include *.basis in gfx package
Also fix a potential problem when more than one .pkgdir is used to
construct emscripten packages
* Don't rely on emscripten runtime to enable webgl extensions
This replaces SDL_mixer with an internal streaming and mixing system,
relying only on basic SDL audio support. It's also a partial refactor of
the audio API, most notably BGM-related. The BGM metadata resource type
is gone, as well as the `.bgm` files. The metadata is now stored inside
the `.opus` files directly, using standard Opus tags.
http://sauerbraten.org/iqm/
The iqms were converted from the objs with the official iqm "compiler",
but can be also exported directly from Blender with a script from the
SDK.
In addition, indexed rendering was fixed (it's not useless anymore), and
the winding order convention changed from counter-clockwise to clockwise
to facilitate faster model loading.
A limited subset of IQM functionality is currently supported:
- One mesh per model.
- Only floating point data in vertex arrays.
- Only standard vertex arrays: positions, UVs, normals,
tangents.
- No animations etc.
The "standard" shader interface now receives an additional vec4 tangent
attribute. This attribute is currently ignored by shaders. The bitangent
vector can be computed in a vertex shader as:
vec3 bitangent = cross(normal, tangent.xyz) * tangent.w;
* iqm: remove axis scrambling and re-export models
* remove debug stuff
If "linearize = true" is specified in the .tex file, colors will be
converted from the sRGB color space into the linear RGB color space on
load. Ideally this should be the default, and we should be doing all
color manipulations in linear space, but there's too many things to fix
to make that a reality.
Additionally, "multiply_alpha = false" to prevent colors from being
multiplied by the alpha channel on load.
The texture_post_load shader will no longer be applied when the
preprocessing operation is a no-op.
* new difficult mode suggestions (more within the theme of 'knowledge')
* cleaning up new difficulty descriptions, also changing character select titles to match the STORY.txt
* better transparency mask on Easy
* ran optimize-all-img.sh script
* consistency
* (hopefully) got rid of some half-transparent pixels, especially on Normal.webp
* playermode descriptions! (for real this time)
* Reimu shot description changes (as per PR)
* modify ReimuB description
* More lenient collision detection
* More rounded corners
* Add a task for laser charging (not used yet)
* Make snow halation lasers not use the logic rule
- Logic rules to be removed in favor of tasks
* WIP gles2 compat
* More gles2 compat. Playable with ANGLE now, with some rendering bugs.
* fix matrix mult. order in generic laser shader
* gles20: fix indexed rendering
* Update docs about gles20 status
* fix formatting
* WIP portrait faces
* character expressions for dialogue in first 3 stages (wip)
* dialog: simplified face system, new faces, script revisions (wip)
* fix wrong face name in reimu script
* cirno angry face; elly beaten variant
* render_character_portrait(): fix garbage bg and filter-bleeding
* workaround for incorrect face blending on dialog fade
* render_character_portrait(): fix bogus debug labels
* Replace sprite offsets with the more powerful paddings
* new faces for youmu, wriggle, kurumi; dialogue updates
* fix release build
* Update portraits; add Iku faces and Elly shouting face
* Add Reimu sigh face and Marisa sweat_smile face
* Add Kurumi dissatisfied face
* update Hina
* Initial port
* Switch specific video modes
* Handle clean exit
* Hide option to disable gamepads, force it enabled
* Match buttons layout with Switch controllers
* Hide player name setting (to avoid getting stuck)
* Switch specific VFS setup instead of env bootstrap
* Clean up, get rid of warnings and a few ifdefs
* Add Switch specific build script and assets
* Make vfs setup mount packages
* Re-enable packaging on Switch
* Transpile shaders to es and install them
* Add applet warning and shader deps to README
* Remove script; instead using meson build scripts
* Strict prototypes
* Build script compat with project minimum meson ver
Refactor of pack.py exclude option
* Uniformise header inclusion on arch_switch.c
* Allow input for any dev; hide the option on Switch
* Silence unsused function warnings
* implement player spellcard declarations on bomb
* stagedraw: move "bottom text" to a separate (higher) layer
* update boss spell declaration effect
* import afensorm's character portrait art
* improve dialog visuals
* acknowledge afensorm in credits and COPYING
* 'alphamap' functionality; effects for wriggle and youmu portraits
* update afens art
* add cirno alphamap
* dialog: draw active speaker above other other
* charselect: use r_draw_sprite
* Switch BGMs to Opus
* Switch SFX to Opus; use floating-point mixing
* opus sfx: support resampling via SDL_AudioStream
* bump SDL2 version requirement to 2.0.6
2.0.5 doesn't have the SDL_AudioStream API, and is ancient anyway.
* Major refactoring of the main loop(s) and control flow (WIP)
run_at_fps() is gone 🦀
Instead of nested blocking event loops, there is now an eventloop API
that manages an explicit stack of scenes. This makes Taisei a lot more
portable to async environments where spinning a loop forever without
yielding control simply is not an option, and that is the entire point
of this change.
A prime example of such an environment is the Web (via emscripten).
Taisei was able to run there through a terrible hack: inserting
emscripten_sleep calls into the loop, which would yield to the browser.
This has several major drawbacks: first of all, every function that
could possibly call emscripten_sleep must be compiled into a special
kind of bytecode, which then has to be interpreted at runtime, *much*
slower than JITed WebAssembly. And that includes *everything* down the
call stack, too! For more information, see
https://emscripten.org/docs/porting/emterpreter.html
Even though that method worked well enough for experimenting, despite
suboptimal performance, there is another obvious drawback:
emscripten_sleep is implemented via setTimeout(), which can be very
imprecise and is generally not reliable for fluid animation. Browsers
actually have an API specifically for that use case:
window.requestAnimationFrame(), but Taisei's original blocking control
flow style is simply not compatible with it. Emscripten exposes this API
with its emscripten_set_main_loop(), which the eventloop backend now
uses on that platform.
Unfortunately, C is still C, with no fancy closures or coroutines.
With blocking calls into menu/scene loops gone, the control flow is
reimplemented via so-called (pun intended) "call chains". That is
basically an euphemism for callback hell. With manual memory management
and zero type-safety. Not that the menu system wasn't shitty enough
already. I'll just keep telling myself that this is all temporary and
will be replaced with scripts in v1.4.
* improve build system for emscripten + various fixes
* squish menu bugs
* improve emscripten event loop; disable EMULATE_FUNCTION_POINTER_CASTS
Note that stock freetype does not work without
EMULATE_FUNCTION_POINTER_CASTS; use a patched version from the
"emscripten" branch here:
https://github.com/taisei-project/freetype2/tree/emscripten
* Enable -Wcast-function-type
Calling functions through incompatible pointers is nasal demons and
doesn't work in WASM.
* webgl: workaround a crash on some browsers
* emscripten improvements:
* Persist state (config, progress, replays, ...) in local IndexDB
* Simpler HTML shell (temporary)
* Enable more optimizations
* fix build if validate_glsl=false
* emscripten: improve asset packaging, with local cache
Note that even though there are rules to build audio bundles, audio
does *not* work yet. It looks like SDL2_mixer can not work without
threads, which is a problem. Yet another reason to write an OpenAL
backend - emscripten supports that natively.
* emscripten: customize the html shell
* emscripten: force "show log" checkbox unchecked initially
* emscripten: remove quit shortcut from main menu (since there's no quit)
* emscripten: log area fixes
* emscripten/webgl: workaround for fullscreen viewport issue
* emscripten: implement frameskip
* emscripter: improve framerate limiter
* align List to at least 8 bytes (shut up warnings)
* fix non-emscripten builds
* improve fullscreen handling, mainly for emscripten
* Workaround to make audio work in chromium
emscripten-core/emscripten#6511
* emscripten: better vsync handling; enable vsync & disable fxaa by default
* Added (and fixed) a few useful warnings
* Removed some dead code
* Cleaned up the build system files a bit
* Once again separated ZIP support from data packaging
* Converted macOS cross-compilation options into cross-file properties