Commit Graph
1546 Commits
Author SHA1 Message Date
Nunuhara Cabbage ec4b608877 Merge pull request #347 from brombrom-hani/parts-sprite-deform
parts: impl sprite_deform for SetPartsCG
2026-06-01 17:55:27 -07:00
BromBrom-Hani 12735d5c8c parts: sprite_deform for SetPartsCG string index
Keeps the PE_SetPartsCG_by_string_index consistent with the rest of the SetPartsCG variants
2026-06-01 08:43:24 +02:00
Nunuhara Cabbage 22d58d977a Merge pull request #346 from kichikuou/3de-parser
SealEngine: Add .3de parser, effect framework, camera, and sound
2026-05-31 18:11:38 -07:00
Nunuhara Cabbage 20e0d00661 Merge pull request #345 from kichikuou/bone
3d: Match MOT bones to POL bones by array index
2026-05-31 18:10:21 -07:00
BromBrom-Hani a706a41dcb parts: impl sprite_deform for SetPartsCG 2026-05-31 12:22:36 +02:00
kichikuou bf0b2bb44f SealEngine: Add .3de parser, effect framework, camera, and sound
.3de is the particle/effect format used by SealEngine. Like the
ReignEngine's .pae, it is a text format describing an effect as a set of
emitters, but the two differ enough in design that .3de lives in its own
file (s3de.c) rather than being folded into particle.c.

This commit lays the groundwork:

- Parse .3de text.
- Integrate effect loading, playback, and caching into the existing
  infrastructure.
- Apply the camera object's per-frame override to RE_camera.
- Play the companion sound asset.

Billboard and polygon-object rendering will be added separately.
2026-05-31 08:22:01 +09:00
kichikuou 916daec6b2 3d: Match MOT bones to POL bones by array index
The original {Reign,Tapir,Seal}Engine apply motion bones to model bones
purely by array position, never consulting bone name or bone_id.

This fixes bone animation of "Shizuka & Nagi" model in Rance 9.
2026-05-29 07:17:41 +09:00
Nunuhara Cabbage 1fcccb766c Merge pull request #344 from kichikuou/passed_time
PartsEngine: clamp passed_time to 0 in PE_UpdateComponent
2026-05-27 21:00:56 -07:00
kichikuou aa112849de Remove passed_time parameter from parts_render_update 2026-05-28 07:39:15 +09:00
kichikuou 8ca1a31ccc PartsEngine: clamp passed_time to 0 in PE_UpdateComponent
After loading a save, the game script may give a negative passed_time
because it computes the delta time using an absolute system.GetTime()
value stored in the save data.

This fixes hang on load in Rance 9.

This also removes the equivalent workaround in parts_render_update for
Rance 01, since the new clamp covers that case as well.
2026-05-27 12:42:50 +09:00
Nunuhara Cabbage 2c622bb331 Merge pull request #343 from kichikuou/mpr
SealEngine: Add .mpr (motion material keyframes) support
2026-05-25 19:07:24 -07:00
kichikuou c01a27583c SealEngine: Add .mpr (motion material keyframes) support
.mpr is an optional sidecar to .mot used by SealEngine, replacing .txa
used in ReignEngine / TapirEngine. While .mot drives bone poses, .mpr
drives material properties on a per-frame timeline.

Supported keys, all keyed by frame number:

  Object{MulAlpha,MulDiffuse,AddAmbient} : applied to the whole model
  Mesh{MulAlpha,MulDiffuse,AddAmbient}   : applied per named mesh
  MeshTextureAnime                       : swap diffuse texture index

Colors and alpha use linear interpolation between keys. Out-of-range
frames hold the nearest endpoint.

Mesh* tracks act as per-mesh tints and do not leak to other meshes
that happen to share a material. MeshTextureAnime is the exception:
it rewrites the shared material's diffuse slot, so all meshes using
that material animate in sync (e.g. in Rance 9, hanny_black_move.mpr
lists only hibana_R but hibana_L animates together).
2026-05-22 13:57:02 +09:00
Nunuhara Cabbage ced4daa331 Merge pull request #342 from kichikuou/camera
3d: Fix camera yaw direction and rotation order
2026-05-19 20:41:33 -07:00
kichikuou 9eee82c13b 3d: Fix camera yaw direction and rotation order
The camera view direction was computed incorrectly in two ways:

1. glm_euler (XYZ order) applies pitch around world X. The original
   engine uses YXZ where pitch is around the camera's local X after yaw.

2. SetCameraAngle negated the input yaw.
2026-05-20 07:10:41 +09:00
Nunuhara Cabbage f53ec98d53 Merge pull request #340 from kichikuou/emitter
Flat: Add particle emitter support
2026-05-18 22:19:56 -07:00
kichikuou 32f4253948 Flat: Guard against division by zero in particle time calculation 2026-05-19 11:38:36 +09:00
kichikuou cb0b969492 Flat: Add particle emitter support
This implements rendering of FLAT_LIB_EMITTER libraries: timed spawning,
per-particle motion, fade, and 3-axis rotation.

For each visible emitter, render_flat_emitter() builds an emitter base
matrix from the ancestor key stack so particles follow their parent
timelines. parent_key_mode chooses between filtering ancestor properties
via the emitter's inherit_* flags (SELECTIVE) and using ancestor poses
wholesale (ANCESTOR_CURRENT / ANCESTOR_AT_BIRTH). For each birth frame
in the lifetime window, parts_flat_foreach_emitter_particle() reseeds
the RNG from (rand_seed, birth_frame), making particles deterministic
across re-renders, and yields each particle's pose, which is composed
with the emitter transform and submitted as a quad through the standard
parts texture pipeline.
2026-05-19 07:12:11 +09:00
Nunuhara Cabbage 0030e28471 Merge pull request #339 from kichikuou/parts-3dlayer-z
Parts: Fix Z-order of 3DLayer and Movie parts
2026-05-16 07:46:35 -07:00
kichikuou 224db2f9cc Parts: Fix Z-order of 3DLayer and Movie parts
3DLayer and Movie parts use a SACT sprite as their render target (for
SealEngine output or movie frames). That sprite was registered into
the scene at z=0, so the content was drawn at z=0 instead of (or in
addition to) the parts engine's render path at the parts' configured Z.

Hide the bound SACT sprite from the scene so the parts engine is the
sole renderer of its texture, and add a parts_render case for 3DLayer
that composites the bound sprite's texture through parts_render_cg.
2026-05-16 12:44:17 +09:00
Nunuhara Cabbage 33d07c190e Merge pull request #338 from kichikuou/color-propagation
Flat: Fix color propagation for nested flat TIMELINE libraries
2026-05-12 17:11:52 -07:00
kichikuou a4dd6a42df Flat: Fix color propagation for nested flat TIMELINE libraries
Propagate parent keys' mul/add color parameters to child TIMELINE
library rendering.
2026-05-12 10:25:03 +09:00
Nunuhara Cabbage da268288c3 Merge pull request #337 from kichikuou/flat
Parts: Stop motion support and rendering fixes
2026-05-10 09:58:02 -07:00
kichikuou f535223988 Flat: Support angle_x/angle_y rotation and reverse_lr/reverse_tb
The original engine implements proper perspective projection, but we
use simpler orthographic foreshortening. In Rance 9, the visual
difference is barely noticeable.
2026-05-09 12:12:38 +09:00
kichikuou f9087eb7ac Flat: Fix area_x/area_y leaking into screen position
area_x/area_y select a sub-rectangle of the texture, but should not
shift the on-screen position. Translate the quad by (-area_x, -area_y)
to cancel the offset the sub-rect's top-left would otherwise introduce.
2026-05-07 12:42:08 +09:00
kichikuou 636743478c Flat: Propagate parent TIMELINE's draw_filter
A parent key's draw_filter had no effect on CG/STOP_MOTION leaves
inside descendant TIMELINE libraries. Resolve the effective filter
at each key (own if non-NORMAL, otherwise inherited) and thread it
through the render chain.
2026-05-07 12:18:35 +09:00
kichikuou a2f087b7f9 Flat: Add support for FLAT_LIB_STOP_MOTION
FLAT_LIB_STOP_MOTION represents a sprite animation as a sequence of CG
frames. A stop_motion library specifies a base CG file (e.g. "foo.png");
at load time, parts_flat_load() discovers numbered frame variants
("foo_01.png", "foo_02.png", ...) and builds a frame list.

At render time, the active frame is resolved from the local timeline
clock using three parameters:
  - span: number of timeline ticks each frame is displayed
  - loop_type: 0 = play once and stop at last frame,
               1 = loop forward,
               2 = ping-pong (forward then backward)
  - local: the timeline's current local time
2026-05-07 11:23:53 +09:00
Nunuhara Cabbage 07bd9c7438 Merge pull request #336 from kichikuou/draw_filter
Parts: support and fix multiply/screen draw_filter
2026-05-03 07:54:48 -07:00
Nunuhara Cabbage 028c907a12 Merge pull request #335 from kichikuou/InputString
Fix save comment editing in Rance 02
2026-05-03 07:54:29 -07:00
kichikuou c45bb3a736 Parts: support multiply/screen draw_filter for parts_render_cg 2026-05-03 12:39:43 +09:00
kichikuou 484f383826 Parts: fix multiply/screen draw_filter to respect alpha
The multiply and screen blend functions used in render_flat_item
ignored the source alpha, so transparent pixels still modulated the
destination color instead of leaving it untouched.

Add a draw_filter uniform to the parts fragment shader and have it
output an alpha-baked source color, so that the framebuffer result
after the GL blend equation interpolates correctly in alpha:

- multiply: shader outputs src = mix(vec3(1.0), mod_color, alpha)
  blend (GL_DST_COLOR, GL_ZERO) gives src*dst,
  i.e. mix(dst, mod_color*dst, alpha)
- screen: shader outputs src = mod_color * alpha
  blend (GL_ONE, GL_ONE_MINUS_SRC_COLOR) gives src + (1-src)*dst,
  i.e. mod_color*alpha + (1 - mod_color*alpha)*dst

In both cases alpha=0 leaves the destination untouched, alpha=1
gives the full multiply/screen result.

Also switch the surface-area mask from multiplication to discard,
so pixels outside the rect leave the destination intact under
multiply blending (where multiplying src by 0 would otherwise
zero out dst).
2026-05-03 12:39:41 +09:00
kichikuou af12e19859 Fix missing src/parts/message.c in CMakeLists.txt 2026-05-03 07:37:02 +09:00
kichikuou e83cb1c91e InputString: Handle Backspace key to delete last character
This adds a key handler facility to input.c so that the InputString
can intercept the Backspace key while the IME is open, and remove the
last character from the result string. Backspace is ignored while the
IME has composing text, so it does not interfere with IME editing.
2026-05-03 07:13:47 +09:00
kichikuou 4c4a62e1ed Fix InputString.GetResultString() in Rance 02
The newer version (from Boku Dake no Hokenshitsu onwards) of
InputString.GetResultString() does not clear its internal string.

This fixes the issue in Rance 02 where the text always remained empty
when editing save comments.
2026-05-03 07:12:33 +09:00
kichikuou f01e41be12 Implement InputString.SetResultString
Used in Rance 02.
2026-05-03 07:12:33 +09:00
Nunuhara Cabbage 6bb00a268c Merge pull request #334 from kichikuou/vm
Fix heap use-after-free during method calls in Rance 9 and later
2026-05-01 20:22:42 -07:00
kichikuou 9ed1f52627 VM: Keep struct page alive during method calls for AIN v6.1+
This fixes heap use-after-free in the music mode in Rance 9.

Hold a reference to the struct page (`this` pointer) for the duration
of a method call. Without this, if the sole external reference to an
object is dropped during one of its method calls (e.g. an event handler
that destroys its own parent), the object and its members are freed
immediately, causing use-after-free when the VM tries to access them
afterward.

This matches the behavior of the original VM, which was introduced in
Rance9.exe and later titles.

The fix is gated on AIN v6.1+ (AIN v6 with a MSG1 section) to match
the original. Applying it unconditionally would change the heap refcount
state visible to resume saves, potentially breaking existing saves for
older games.
2026-05-02 07:56:47 +09:00
Nunuhara Cabbage 59789c0a8a Merge pull request #333 from kichikuou/text
PartsEngine: Fix text issues in Rance 9
2026-04-28 17:54:53 -07:00
kichikuou 13d0c51351 PartsEngine: Fix text line layout
line_space was stored but never used during rendering or size
calculation. Apply it as inter-line spacing in both the size calculation
and the render path. Also initialize empty lines with the current text
style height so that newline-only lines occupy the correct space.

Change line_space from unsigned to int because negative values can be
set.
2026-04-28 11:18:58 +09:00
kichikuou 46bdbb05ef PartsEngine: Re-render text when font properties change
This fixes the rendering of the sample message in the "Message Color"
configuration of Rance 9.

PE_SetPartsFont* and PE_SetText*Space functions only modified the text
style struct without re-rendering existing character textures. Since
character glyphs are baked into textures at append time, subsequent
style changes had no visible effect.
2026-04-28 11:15:00 +09:00
Nunuhara Cabbage 234b04b460 Merge pull request #332 from kichikuou/SealEngine
SealEngine: Implement and stub various functions
2026-04-25 20:37:52 -07:00
Nunuhara Cabbage ae9544a1ac Merge pull request #331 from kichikuou/POLv4
SealEngine: Support POL v4 format
2026-04-25 20:37:33 -07:00
kichikuou 6509dca693 Add stub for SystemService_GetAntiAliasingMode 2026-04-26 11:26:20 +09:00
kichikuou bf455de35d SealEngine: Implement MagSpeed functions
mag_speed is a per-plugin integer (default 1) set by SetMagSpeed on
all existing plugins. use_mag_speed is a per-instance flag (default
true) set by SetInstanceUseMagSpeed. When use_mag_speed is true,
motion delta_frame is multiplied by mag_speed.
2026-04-26 11:26:20 +09:00
kichikuou 511f6a4bfa SealEngine: Implement and stub various functions 2026-04-26 11:26:17 +09:00
kichikuou 4239345289 SealEngine: Support POL v4 format
POL v4 introduces material groups with texture blending. A material's
sub-material can be a "blend group" containing exactly two leaf
materials, whose textures are blended using per-vertex weights for
smooth terrain transitions.
2026-04-26 10:03:09 +09:00
Nunuhara Cabbage 955950198e Merge pull request #330 from kichikuou/3dlayer
PartsEngine: Implement 3DLayer parts type
2026-04-25 09:35:14 -07:00
kichikuou 63ab438391 PartsEngine: Implement 3DLayer parts type
This adds PARTS_3DLAYER type that creates a SealEngine plugin bound to a
SACT sprite.
2026-04-25 12:06:01 +09:00
Nunuhara Cabbage 1dd37559bb Merge pull request #329 from kichikuou/drag
PartsEngine: Implement drag-and-drop processing
2026-04-24 18:42:52 -07:00
kichikuou f52f4bd1f0 PartsEngine: Simplify parts_msg_push() calls 2026-04-25 07:49:08 +09:00
kichikuou 1b87d3f9a5 PartsEngine: Implement drag-and-drop processing
This implements Parts_SetDrag and drag/drop event handling. When a part
has drag enabled, clicking and moving the mouse will move the part and
emit DRAG_BEGIN/DRAGGING/DRAG_END messages. Drop target detection emits
DROP_ENTER/DROP_ON/DROPPED/DROP_LEAVE messages on parts under the cursor
during drag.
2026-04-25 07:38:46 +09:00