AGS 3.6.1 - Release Candidate (RC 6)

Started by Crimson Wizard, Sat 06/01/2024 16:56:21

Previous topic - Next topic

Crimson Wizard

AGS 3.6.1 - RC 6
Full release number: 3.6.1.21


For Editor
Spoiler

For Android
Spoiler
NOTE: the Editor now includes Android build component letting you prepare your own games for Android
[close]

For Engine/Editor developers
Spoiler


Released: 13th March 2024

Previous stable version: AGS 3.6.0 P10 forum thread


This release is brought to you by:

- Alan v.Drake (fixes, improvements)
- Crimson Wizard
- edmundito (iOS fixes)
- eri0o
- Walter Agazzi (fixes)



Summary

3.6.1 update is focused mainly on improving performance and usability of existing features.

The noteable addition to the Editor is a "Log Panel", which lets you read game logs right in the editor's window. "Goto definition" now works on game object script names and opens their respective panels. Room editor features better panning and zoom controls. Views allow to select and modify multiple frames at once.

In the engine, there's a significant improvement to script performance, which may make script-heavy games run 30-40% faster compared to AGS 3.6.0 (these were real test results on a certain game with 3D simulation). There's a big improvement to the speed of manipulating Overlays, and general speed improvement of graphics rendering primarily useful for high resolution games.

There are other fixes and additions to various parts of the program too.

The full changelog follows.


What is new in 3.6.1

Common features:
- Implemented Deflate compression option for sprites.
- Removed length limits for: Game name, savegame folder, Character's script name and regular name (description), Inventory item's name (description), Mouse cursor's script name, Audioclip's script name.

Editor:
- Discontinued Source control integration functionality, removed "Put sound and sprite files in source control" option from General Settings.
- In General Settings moved few properties to different groups for better consistency.
- Added "Scale Character sprite offsets" property to General Settings. This property refers to scaling of Character.z and sprite offsets added by LockViewOffset script command.
- Added TextureCacheSize and SoundCacheSize properties to Default Setup. These let configure the sizes of runtime texture and sound cache sizes respectively.
- Added "Leave room after fade-out" event to Rooms (called "Unload" by default).
- Added Translated property to all GUI Controls (was available only in ListBox). Translated property tells whether this control's text has to be translated, and applied text direction (in right-to-left text mode).
- Support '\n' linebreak character in the Label's Text and potentially other text properties.
- Improved Room Editor controls:
    Added free panning mode done by holding the middle mouse button, or alternatively - by holding Space + LMB.
    Mouse Wheel without key modifiers scrolls the room vertically; Shift + Mouse Wheel scrolls the room horizontally.
    Zoom is done by Ctrl + Mouse Wheel and room now zooms towards or outwards the cursor position.
- In Room Editor the context menu is now displayed by RMB or Shift + RMB while editing masks.
  The individual room mode menu is merged with the "copy coordinates" command when shown.
- In Room Editor the hint with coordinates is now also displayed when moving Objects or Characters with keyboard.
- In Dialog Script editor support most Edit menu and context menu commands from the regular Script editor, with a few exceptions.
- In Sprite Manager added command "View" -> "Show filenames" which toggles display of a sprite's source filename under the sprites.
- Adjust sprites' import settings after "Crop sprite edges" command; this would ensure that these sprites are restored from source file keeping their cropped sizes.
- During sprite export Editor will display a proper progress dialog.
- Zoom controls in Character and View panes now allow downscaling too. View editor displays the preview sprite stretched to fill the parent panel.
- View editor now allows to select multiple frames at once, across multiple loops too, using standard Shift + LMB and Ctrl + LMB combinations. Properties panel lets modify properties for all the selected frames at once.
- Added "Replace with all sprites from folder" command to the View editor's context menu.
- For Audio Clips in the project tree added "Force Reimport", "Force reimport all file(s)" and "Replace Source File" context menu commands.
- For Output Panel added "Copy selection" context menu command.
- Implemented Log Panel that lets you see the engine and game logs right in the Editor.
- Improved LipSync panel looks in case user's system has display scaling option enabled.
- "Goto Definition" command in script will now work for most of the game entities too, such as Characters, GUIs, and so forth. In that case it will find a game's entity and open a respective editor panel for it. This still does not work for some types, such as Room objects, and Views.
- Added main menu commands for opening a Project folder and Compiled folder.
- Added "Export Global Messages to script" menu command. This command is meant for upgraded pre-3.2 game projects, and will generate a script with a String array, moving global messages texts there.
- For script's tabs added a context menu command for opening this script's location.
- When run with "/compile" argument Editor will print all messages to the console (stdout), instead of displaying modal message windows.
- For Android build target Editor now supports a directory to place plugins in.
- When building a game for Android and Linux the Editor will now be more tolerant to missing plugins and only issue a warning instead of stopping with error.
- Config will now be saved in UTF-8, letting to support setup program's title text in unicode.
- For non-Windows build targets Editor will fix config containing Direct3D graphics driver option and set OpenGL instead.
- For Color Themes: implemented character literal, braces match and braces error settings.
- Made Editor be somewhat more tolerate to missing XML nodes in Game.agf, in many cases it will still let open a game.
- When upgrading older game projects, Editor will insert a call to SetRestartPoint() in the end of the 'game_start' function in GlobalScript.asc. This is done to complement removal of an automatic restart point in the engine. This inserted command is safe to remove.
- When upgrading pre-3.2 rooms with disabled SaveLoadEnabled property the Editor will reset this property and insert a comment with a warning into the corresponding room's script. This is done because this property is deprecated as is no longer accessible.
- Fixed Editor refusing to open a game if one of the translation files is missing.
- Fixed General Settings and Default Setup not working correctly right after importing a pre-3.* game project.
- Fixed importing GIFs or 8-bit PNGs may lose transparent pixels if source images used other palette index than 0 for transparency.
- Fixed a warning condition for copying 32-bit bitmaps to a desktop clipboard of less color depth.
- Fixed Project Explorer's folders collapsing after certain user actions, such as dragging items or renaming things.
- Fixed a rare exception when scrolling the room in the editor.
- Fixed keyboard shortcuts for GUI Editor's Copy and Paste commands.
- Fixed deleting collapsed "region" in script would sometimes lead to portion of the script undeleted but staying invisible.
- (Possibly) Fixed a "Index out of range" exception in Script editor, related to the "script location" drop-down list, which could occur at random circumstances while working with the script, and any Color Theme is enabled.
- Fixed Editor could miss some of the files when cleaning up old compiled files after the Game's Filename property is changed.
- Fixed "Auto-number speech lines" and "Create voice acting script" operations failing if a Character's name contains underscore.

Scripting:
- Support "#else" preprocessor directive.
- Fixed escaped character literals not being parsed correctly. This makes character literals like '\n' and '\t' actually work in script.

Script API:
- Implemented Room's "After fade-out" event.
- Added eEventLeaveRoomAfterFadeout event for the global "on_event".
- Added eEventGameSaved event which runs after game was saved.
- Expanded interaction functions for Character, Object, InventoryItem, Hotspot and Region types: now they all receive respective object's pointer as a parameter, similar to GUI event functions, as well as a cursor mode this interaction was run with, if applicable.
- Added Game.ResetDoOnceOnly(), which completely resets all DoOnceOnly instances.
- Added Game.PrecacheSprite() and Game.PrecacheView(), which preload certain sprites and linked frame sounds into the engine's sprite cache memory.
- Added ScriptName property to AudioClip, Character, Dialog, GUI, GUIObject, Hotspot, InventoryItem, Object.
- Added static GetByName() function to AudioClip, Character, Dialog, GUI, GUIObject, Hotspot, InventoryItem, Object.
- Added Object.AnimationVolume property, which works similar to Character.AnimationVolume.
- Added static File.ResolvePath() and File.Path attribute.
- Added support for a text formatting to a number of functions: DisplayAtY(), Character.SayAt(), Character.SayBackground(), DrawingSurface.DrawStringWrapped().

Engine:
- Updated to SDL 2.28.5 and SDL_Sound 2.0.3+.
- Significant performance improvement to scripts. Script running speed restored to a level close to AGS 3.2.1. Testing few "script-heavy" games showed fps raise by up to 30-40% compared with 3.6.0 engine.
- Improved performance of String objects in script. For instance, appending a character to a String is now roughly x2 times faster, *sequential* iteration of String.Chars[] in Unicode mode is about x12 (!) times faster (Strings in ASCII mode have relatively less improvement, because they have been faster than Unicode mode already).
- Improved performance when creating, deleting and manipulating Overlays; allows the game to have thousands of those with much less slowing down.
- Improved performance when updating and deleting dynamic sprites, and notifying any objects that have to redraw themselves. Engine no longer resets Graphic properties of objects referencing deleted dynamic sprite to 0.
- Implemented "texture cache", in addition to the existing "sprite cache". The texture cache keeps textures generated from raw sprites and lets reusing them, improving performance and reducing CPU workload. The actual impact is proportional to the game's resolution and amount of simultaneously animated objects on screen.
- Improved OpenGL texture management, which should result in less system and video memory spent on sprite textures.
- WFN font renderer now too supports unicode mode and renders texts in utf-8, so long as the font contains glyphs of corresponding indexes.
- Buttons, ListBoxes and TextBoxes now support Right-to-left text direction.
- DrawingSurface.DrawString now supports Right-to-left text direction.
- All the script File functions now treat paths in case-insensitive way (including subdirs), which makes them platform-independent.
- Removed an automatic SetRestartPoint() call at startup. This is done in case user does not want to use default "restart" save slot, or has a custom save system.
- Support handling multiple mouse clicks per game frame, similar to how multiple key presses were supported since 3.6.0.
- When starting up, engine will now precache only first 4 or 8 loops of the starting player character's View. This is done to avoid filling sprite cache with too much sprites at once in case when the player's View contains lots of additional animations.
- Characters will now have their graphic offsets, set by Character.z property and LockViewOffset() function, scaled along with the character's own scaling. This is done so long as the respective game option is enabled in the General Settings.
- Ensure that character and object scaling is updated even when the game is not drawn. This fixes rare issues when their scale property did not update in time whilst the game was completely fadeout, and similar cases.
- Allow to change Character's move speed while its moving.
- When Character is ordered a new move command while already moving, the engine will try to make a smooth transition between old and new moving without a delay.
- Engine will now log a warning for the most incorrect parameters to Animate function instead of quitting the game.
- Engine will now skip blocking Character.Say commands instantly while skipping a cutscene.
- Object.SetView now lets invalid loop and frame values, and fallbacks to using loop 0, frame 0, printing a warning. This is also consistent with backwards-compatble SetObjectFrame() behavior.
- Changed Object.SetView() to not play a frame's sound, which could lead to a duplicated sound play if Object.Animate is run right after.
- Text Overlays internal images are now registered as dynamic sprites, and their IDs may be read from Overlay.Graphic. This lets find out their sizes using Game.SpriteWidth/SpriteHeight and optionally draw them somewhere using DrawingSurface.DrawImage.
- Ensure that when Overlays have identical ZOrder they will be sorted in the order of their creation. Besides convenience, this is also meant to restore historical behavior from before Overlay.ZOrder property was introduced.
- Allow game to call DynamicSprite.CreateFromDrawingSurface() and CreateFromBackground() with zero or negative size, clamping it to 1x1, in consistency with Create().
- Ensure all the script API is now correctly available for the plugins.
- Engine will now safeguard plugin's reading and writing of game saves, so that any mistakes done by plugins won't affect other parts of a save.
- Engine will disable vsync in a "infinite fps" mode, because vsync prevents getting more fps.
- Engine will force any in-game debug messages to be displayed in standard message boxes, disregarding game's "Display all messages as speech" option.
- Display critical alerts as message boxes on all platforms that support that (unless engine is run with "--no-message-box" parameter).
- Print some info about memory usage when reporting a "Out of memory" error.
- Deprecated in-game "console", as practically useless.
- Added new config settings in "graphics" section: "sprite_cache_size" (which replaces deprecated "cachemax" in "misc") and "texture_cache_size".
- Fixed Characters may be seemingly "walking in place" for some time when arriving at destination.
- Fixed Display and Say commands treating the second met "&" sign as a voice-over token too (they must only check the first one in string).
- Fixed PlayMP3File() function limiting filename argument by an arbitrary number of characters.
- Fixed speechlines were adjusting their Y position while trying to not overlap GUIs even when these GUIs are completely offscreen.
- Fixed first Sierra-style speechline in a sequence was adjusting its Y position without need when GUIs are set to be hidden during game pause (this includes blocking speech). Normally, the speechlines are adjusting their Y position in order to not overlap GUIs, but when GUIs are hiding during speech there should not be any need to do so.
- Fixed script behavior in case a local variable was assigned a value without being initialized with a zero memory by compiler's intruction beforehand. This is not a problem with the standard compiler, but technically could be an issue with any custom implementation.
- Fixed old-style letterbox viewport getting broken after loading an old pre-3.5.0 save.

Engine Plugin API:
- Added IAGSStream interface, IAGSEngine.OpenFileStream() and GetFileStreamByHandle().
- Added IAGSEngine.ResolveFilePath() method, which resolves a script path (with location tokens) into a proper system filepath.
- Fixed IAGSEngine.GetFontType() incorrectly reporting TTF font type for WFN fonts with more than 128 characters.

Compatibility:
- In Editor, restored all the Character's variables available in "backward-compatible" mode. This is primarily to make it easier to import very old games.
- Allow to run an animation over a loop with zero frames, by using the placeholder frame. This lets particular old games to continue running instead of crashing with error.
- Fixed slower character walking speeds in pre-3.1 upscaled and high-resolution games.
- Fixed Object.SetView() and SetObjectFrame() not treating -1 for loop and frame as "keep previous values" in older games.
- Fixed inventory window not updated after game.top_inv_item is assigned a new value.
- Fixed a "New Room" command in old-style dialog scripts was preventing "First time Enter room" event to be called.

iOS:
- Updated port for 3.6.*.

Web / Emscripten:
- Fixed Safari cannot switch the game into fullscreen mode.

Windows:
 - 32-bit Windows engine is now built as "large address aware" program, which will allow it to use up to 3 GB of RAM on 32-bit systems and 4 GB of RAM on 64-bit systems (was 2 GB previously).

WinSetup:
- Added options for setting texture cache and sound cache size.
- Added options to disable particular graphic drivers and graphic driver selection, and fullscreen mode selection.





Log Panel

We're now featuring a new Editor window called "Log Panel".



If it's not present, it may be enabled in the "Window" menu.

This panel receives log messages from the engine when running the game in a test mode (F5), and prints in the text box. This is a short-term log, it's limited by 4k messages (i think) and when hitting the limit it will clear the older ones. Its main purpose is to let users see the current and the recent state of the game.

The log settings may be configured by pressing the "Show configuration" tool button, this will make them visible to the right from the log window. The settings include 2 groups of settings:
* Log Output - lets configure the minimal level of messages that the Editor will receive. These options are only applied once the game is starting.
* Log Filter - lets configure the current (temporary) level of messages. These options may be applied anytime.

The message types are dividing between Main, Game and Script.
Main - is the main engine messages, mostly related to something important initializing or changing.
Game - are various game-related events.
Script - are messages printed by a System.Log command in script.

The Log window's font may be configured separately, in Editor Preferences, on "Advanced" tab.

Expanded interaction functions

Regarding expanded interaction functions, these are functions connected to Look at, Interact, Talk to and other similar events. They all now may have 2 parameters: a pointer to object, and cursor mode, similar to the following examples:
Code: ags
function Ego_Interact(Character *c, CursorMode mode)
function oObject1_Look(Object *o, CursorMode mode)

Exceptions:
- Hotspot WalkOn and MouseOver events do not have CursorMode parameter.
- All Region events do not have CursorMode parameter.

The purpose of this addition is to improve situation where you connect same function to multiple events and/or multiple objects at once. In such case you will be able to distinguish object and mode for which the function is actually called.

These new parameters are optional. If you don't have them declared in script, they will be ignored by the engine, and your script is going to run as before.
Also, naturally, you do not have to use them, if you don't need to (even if they are declared).

WFN fonts supporting Unicode

Engine can now draw unicode texts using WFN fonts too, if WFN fonts have appropriate letters.
Unfortunately, existing WFN editors do not let add letters at indices higher than 255. This means they need to be upgraded to allow arbitrary higher slots.
Current WFN format does not exactly have a limit to the glyph index, but it has a limit to 64k bytes of letter pixel data. This amount potentially allows it to store several alphabets in low-resolution within a single font. You may always split languages into separate fonts anyway.

Here's the modified Radiant's FontEdit which supports editing any character in range 0-65535:
https://www.dropbox.com/s/xth28bfzu78vtqi/FontEditUni.zip?dl=0
this is an "unofficial" version made purely for test.
The source project may be found here (if anyone is interested):
https://github.com/ivan-mogilko/fontedit
The example of the WFN font hosting Greek alphabet (only capitals, for test):
https://github.com/adventuregamestudio/ags/files/11540578/AGSFNT0_UNI.zip
may be tried with e.g.
Code: ags
Display("ΟΙ ΘΕΟΙ ΤΟΥ ΟΛΥΜΠΟΥ"); // THE GODS OF OLYMPUS

vga256

Can confirm the dissolve transition transparency fix works great. Thank you!

Dave Gilbert

Quote- When Character is ordered a new move command while already moving, the engine will try to make a smooth transition between old and new moving without a delay.

This alone is worth the update. Thanks so much! Can't wait to dive in.

Dave Gilbert

Sorry for the double post. I've installed the RC and I've run into a weird issue. When I make an executable of my game and try to run it, the music does not play. But when I run my game in test mode by pressing F5, the music plays normally. Other sounds like sfx play fine. Here are my setup settings:



Any light-shedding appreciated!

-Dave

eri0o

#4
I reproduce @Dave Gilbert mentioned issue. It seems it's just audio files that are big enough to require streaming (bigger than MaxLoadAtOnce). I am not sure yet why - (load_sound_clip is giving me a nullptr).

I get 0 frames here
https://github.com/icculus/SDL_sound/blob/c5639414c1bb24fb4eef5861c13adb42a4aab950/src/SDL_sound_vorbis.c#L126

Edit: reported it here
https://github.com/adventuregamestudio/ags/issues/2287

Crimson Wizard

Yes, there was a mistake in one of the recent betas. I cannot believe i missed this, probably was testing games without audio lately. I will have to create a new release today.

eri0o


Crimson Wizard

@Dave Gilbert there's a temporary build with a fix here:
https://cirrus-ci.com/task/5565412033691648

Something else came up, so I'm delaying a proper update for a short while.

Dave Gilbert

The fix works! Music now plays properly. Thanks so much.  :-D

Crimson Wizard

Updated to RC2
(Please use download links in the first post)

Editor:
 - Adjust sprite's import settings after "Crop sprite edges" command; this would ensure that this sprite is restored from source file keeping the cropped size.
 - Fixed "\\[" escaped sequence not saved correctly in game properties (GUI Label, etc) (regression since 3.6.1 Beta).
 - Fixed a warning condition for copying 32-bit bitmaps to a desktop clipboard of less color depth.
 - Fixed keyboard shortcuts for GUI Editor's Copy and Paste commands.

Engine:
 - Fixed NumPad keys not handled properly by the engine (in on_key_press, IsKeyPressed, and TextBox control).
   This is a regression since 3.6.0.
 - Fixed loading pre-3.* games could lead to a memory corruption (regression in RC1).
 - Fixed audio not playing when loaded from the game package (regression in RC1).

Dave Gilbert

#10
I am unsure if this issue has been here for awhile, or if it's new to RC2.

In my game, I animate heads on top of bodies (using two different characters) so they can do gestures and expressions seperately. I noticed that if I tick the "render sprites at screen resolution" option on, and play the game in a window, there are lines where the heads and bodies meet:



(there's a line on the man's neck as well but it's harder to notice).

In fullscreen, everything is displayed fine.

I personally don't use the "render sprites at screen resolution" option, but I feel like this shouldn't be the proper behavior? I'm sure someone, somewhere, will accidentally turn it on and call it a bug. :) Anyway, will keep plugging away!

-Dave

Edit: Some additional info!  I typically use openGL. I tested it in "software renderer" mode and the line didn't show up.
Edit2: I tried it in Direct3D mode and the line returned.
Edit3: Here's some more! I typically run the game using "linear interpolation". I switched to "nearest neighbor" just to check and the line didn't show up in any of the three drivers.

Crimson Wizard

#11
Quote from: Dave Gilbert on Fri 12/01/2024 22:37:11I am unsure if this issue has been here for awhile, or if it's new to RC2.

In my game, I animate heads on top of bodies (using two different characters) so they can do gestures and expressions seperately. I noticed that if I tick the "render sprites at screen resolution" option on, and play the game in a window, there are lines where the heads and bodies meet

This has been an issue for a while. I've seen it in another game, run in 3.6.0, and maybe earlier versions, where similar problem affected walk-behinds. It looked like a 1 pixel gap between walkbehind cut-out and a non-walkbehind part of room background.

This problem exists only in non-software renderers, and is probably related to a "uneven" texture size.
Linear interpolation causes antialiasing where texture edges may become half-translucent. Although I can't remember if this problem was seen with nearest-neighbour or not.

At the moment, I don't know how to fix this, or if this is even possible to fix in the engine.

The only non-engine solution I may think of is to overlay objects a little, by a few pixel lines. In other words, you make your head sprites higher by 2-3 pixels and have copy of body pixels in this extra part. When positioning, the head should overlay a body by this amount (or other way around). This might make things look seamless.

eri0o

@Dave Gilbert curious, can you check if the heads where the line appears between the bodies have odd height? If they are indeed an odd height, can you try adding an empty blank line so they have even height and see if this fixes? (I don't know how you attach the heads to the bodies though, the code there may need adjustments because characters usually are referenced by feet)

Snarky

#13
It occurs to me that the way I would probably do this compositing of separate character parts would be to make both the sprites the full character size, just with transparent portions. That way the positioning and scaling would be trivial. Is that what you've done as well, @Dave Gilbert?

Because in that case, I think the seams may be an unavoidable consequence of smooth scaling. A pixel that belongs 50% to the head sprite and 50% to the body sprite will end up 25% transparent, because each part is rendered at 50% opacity.

The only way around it I can think of is to merge the two sprites together on a full-scale dynamic sprite and then scale that—but this might end up causing the game to stutter.

Edit: Another possible solution, if there is a static overlap between the two parts of the character (i.e. a row of pixels along the seam that doesn't animate), would be to include this overlap in both sprites. While this will not completely eliminate the seam in all situations, it will make it a lot less noticeable.*

Unfortunately, if you do this you might end up with a little "bump" along the edge of the character, as the anti-aliased edge become less transparent than it is supposed to be just there. If this is noticeable in practice, a refinement would be to exclude the edge pixel from the overlap.

Similarly, the approach only works if the character is fully opaque. For a semi-transparent character (like a ghost or hologram), you will be drawing the overlap twice and therefore end up with the opposite problem: a line where the opacity is too high.

*I believe that in general, with an overlap of n pixels and a scaling factor of p, the worst case is ((1-np)/2)^2. With no overlap, this gives a 25% transparent seam in the worst case at 50% scaling (or, in this case, any scaling). With 1 pixel overlap, it gives just a 6.25% transparent seam at the same scaling. (And if np>= 1, there will be no seam at all; so that with a 2-pixel overlap you are guaranteed no seam at 50% scaling or above.)

Dave Gilbert

You are right. If I extend the head/neck areas by a few pixels it does make the line go away. There are dozens of characters in the game so I was hoping to avoid having to manually edit every single talking frame on every expression for every character  (that's hundreds of files), but if it can't be avoided I guess that's what I'll do. That's what I get for not testing this out long before now! Thanks either way.  :grin:

Crimson Wizard

#15
Quote from: Dave Gilbert on Sun 14/01/2024 18:59:26You are right. If I extend the head/neck areas by a few pixels it does make the line go away. There are dozens of characters in the game so I was hoping to avoid having to manually edit every single talking frame on every expression for every character  (that's hundreds of files), but if it can't be avoided I guess that's what I'll do. That's what I get for not testing this out long before now! Thanks either way.  :grin:

I'm certain that this may be automated. If your sprite files are organized in pairs (e.g. by having matching part in the name), someone could write a tool that would load both images, copy first few non-transparent lines from body sprite to head sprite, and save head sprite. Then you could run this tool over a folder with image files.

Snarky

#16
Yeah, depending on how you have it set up, it may be fairly simple to automate (ideally as a batch operation over all files, but at least to do the necessary edit as a single action on each file). Might be possible to do as a macro in Photoshop with a bit of ingenuity, if you're not prepared to script it in a command-line tool like imagemagick.

If you have to check in each case how many rows of pixels you can overlap before it starts interfering with the animation, things get a lot more complicated.

(I thought I should also mention that this approach will not be exactly identical to the "correct" approach of pre-merging the sprites, since along the edge the pixels that are part of the overlap will have more weight than neighboring pixels that aren't part of the overlap when rendering the final "smooth-scaled" pixel value, since they are drawn twice. For example, a rendered pixel that should properly be an even 50-50 blend of two neighboring sprite pixels may end up as a 75-25 blend instead. I think in most cases this will not be noticeable, though.)

eri0o

Hey, did more people downloaded and ran this version? I saw few comments here.

Dave Gilbert

#18
Update on the weird line situation. I did a few more tests and found an area where there are lines around the boundries of a object that is placed on top of another object. For context, there is a door. The player clicks on the door hotspot, then the door object appears and plays an opening animation. When the door object appears, there are lines around it:

Version with the object not visible (no lines)


Version with the object visible. Note the lines,

I'm curious why the lines only appear on the sides, and not the top and bottom.

Unlike the character sprites I mentioned earlier, the object sprite and background aren't slotting together like jigsaw pieces. The door object is placed directly over the door in the background image. There are no alpha channels on the sprite. (Here is the sprite if you want to have a look)

I'm using the same settings as before (openGL, "render sprites at screen resolution" ticked on, only happens in windowed mode)

Any help appreciated!

-Dave

Crimson Wizard

Quote from: Dave Gilbert on Wed 17/01/2024 23:17:59I'm using the same settings as before (openGL, "render sprites at screen resolution" ticked on, only happens in windowed mode)

Could you clarify if this happens with any filter or only linear one?

I suppose that this happens in windowed mode probably because then the screen resolution is not evenly divided on game resolution. It's also possible that if you resize the window, the lines will look different.


In regards to fixing this, I currently don't have much ideas.
But I think it may be worth rendering this sprite to a completely white surface, and also write the texture to file to see the actual runtime texture contents. Because it will be interesting to find out which color these lines actually are, and if these black lines appear as a part of a texture, or as a result of that texture being rendered on screen.

Writing the texture to a file would require some addition or a hack to the engine.

SMF spam blocked by CleanTalk