Compare commits

..
Author SHA1 Message Date
SirKnightly 9acb358049 Automated build commit 2026-11-11 12:59:55 +00:00
9 changed files with 58 additions and 178 deletions

No files matched your search

+5 -8
View File
@@ -676,15 +676,12 @@ bool VulkanTextureManager::uploadAnimationFrames(int handle, bitmap* bm, int com
// Build per-layer copy regions and upload each frame's data
SCP_vector<vk::BufferImageCopy> copyRegions;
// BMPMAN's bitmap flags describe converted pixel data and do not retain the
// BMP_AABITMAP lock flag. EFF animations load each frame separately, so an
// 8-bit PCX sibling locked with flags 0 would trip the bpp assert in
// bm_convert_format. ANI and APNG decode every frame in the triggering lock,
// so their sibling locks load nothing. Other 8bpp sources are safe to treat
// the same way: the standalone server never runs Vulkan, user bitmaps are
// never multi-frame, and the PNG and DDS loaders ignore lock flags.
// Use the same lock parameters that were used for the triggering frame.
// bm->flags contains the lock flags (BMP_AABITMAP, BMP_TEX_OTHER, BMP_TEX_DXT*, etc.)
// bm->bpp contains the requested bpp. Using these ensures all frames are locked
// consistently (e.g., 8bpp for aabitmaps, 32bpp for RGBA textures).
auto lockBpp = bm->bpp;
auto lockFlags = (lockBpp == 8) ? BMP_AABITMAP : bm->flags;
auto lockFlags = bm->flags;
// Set guard flag to make recursive bm_data calls no-ops
m_uploadingAnimation = true;
+5 -15
View File
@@ -17,7 +17,7 @@ namespace graphics::vulkan {
// ========== gr_screen function pointer implementations ==========
int vulkan_preload(int bitmap_num, int is_aabitmap)
int vulkan_preload(int bitmap_num, int /*is_aabitmap*/)
{
auto* texManager = getTextureManager();
@@ -76,14 +76,8 @@ int vulkan_preload(int bitmap_num, int is_aabitmap)
lockFlags = BMP_TEX_ETC2_RGBA1;
break;
default:
// AABITMAP art is a palette-index mask. Keep the indices as R8 so
// the HUD shader can use them as coverage instead of RGB color data,
// matching the draw-time AABITMAP lock in bindMaterialTextures.
// Uncompressed — use 32bpp decompressed
compType = 0;
if (is_aabitmap) {
lockBpp = 8;
lockFlags = BMP_AABITMAP;
}
break;
}
@@ -105,13 +99,9 @@ int vulkan_preload(int bitmap_num, int is_aabitmap)
if (success) {
static int successCount = 0;
// AABITMAP uploads bypass the cap so a playtest can confirm R8 for HUD handles,
// which page in long after the first few textures.
if (successCount < 10 || is_aabitmap) {
auto* uploaded = texManager->getTextureSlot(bitmap_num);
nprintf(("vulkan", "vulkan_preload: Successfully uploaded texture %d (compressed=%d, aabitmap=%d, format=%s)\n",
bitmap_num, compType, is_aabitmap,
uploaded ? vk::to_string(uploaded->format).c_str() : "none"));
if (successCount < 10) {
nprintf(("vulkan", "vulkan_preload: Successfully uploaded texture %d (compressed=%d)\n",
bitmap_num, compType));
successCount++;
}
}
+1 -39
View File
@@ -2002,8 +2002,7 @@ ADE_FUNC(getImageHeight, l_Graphics, "string name", "Gets image height", "number
ADE_FUNC(flashScreen,
l_Graphics,
"number|color /* red value or color object */, number Green, number Blue",
"Flashes the screen by adding the given color (0-255 per channel) to every pixel. "
"Bright parts of the scene can clip to white; see flashScreenAlpha for a blended flash.",
"Flashes the screen",
nullptr,
nullptr)
{
@@ -2034,43 +2033,6 @@ ADE_FUNC(flashScreen,
return ADE_RETURN_NIL;
}
ADE_FUNC(flashScreenAlpha,
l_Graphics,
"number|color /* red value or color object */, number Green, number Blue, number Alpha",
"Flashes the screen by blending every pixel toward the given color by Alpha (0-255), "
"so bright parts of the scene keep their detail instead of clipping as with flashScreen. "
"When a color object is passed, its alpha is used.",
nullptr,
nullptr)
{
if(!Gr_inited)
return ADE_RETURN_NIL;
int r, g, b, a;
if (lua_isnumber(L, 1)) {
if (!ade_get_args(L, "iiii", &r, &g, &b, &a))
return ADE_RETURN_NIL;
} else {
color col;
gr_init_alphacolor(&col, 0, 0, 0, 255);
if (!ade_get_args(L, "o", l_Color.Get(&col)))
return ADE_RETURN_NIL;
r = col.red;
g = col.green;
b = col.blue;
a = col.alpha;
}
gr_flash_alpha(r, g, b, a);
return ADE_RETURN_NIL;
}
ADE_FUNC(loadModel, l_Graphics, "string Filename", "Loads the model - will not setup subsystem data, DO NOT USE FOR LOADING SHIP MODELS", "model", "Handle to a model")
{
const char* s;
-112
View File
@@ -3144,62 +3144,6 @@ ADE_FUNC(getMissileList,
}));
}
ADE_FUNC(getWeaponList,
l_Mission,
nullptr,
"Get an iterator to the list of weapons in this mission",
"iterator<weapon>",
"An iterator across all weapons in the mission, including lasers, missiles, and flak. Can be used in a for .. in loop. Is not valid for more than one frame.")
{
int idx = 0;
return ade_set_args(L, "u", luacpp::LuaFunction::createFromStdFunction(L, [idx](lua_State* LInner, const luacpp::LuaValueList& /*params*/) mutable -> luacpp::LuaValueList {
// iterate through the Weapons array to find the next live weapon
while (idx < MAX_WEAPONS) {
const weapon& wp = Weapons[idx];
idx++;
// unused slots have objnum -1
if (wp.objnum >= 0) {
if (!Objects[wp.objnum].flags[Object::Object_Flags::Should_be_dead]) {
return luacpp::LuaValueList{ luacpp::LuaValue::createValue(LInner, l_Weapon.Set(object_h(wp.objnum))) };
}
}
}
// end of list or no more live weapons found
return luacpp::LuaValueList{ luacpp::LuaValue::createNil(LInner) };
}));
}
ADE_FUNC(getBeamList,
l_Mission,
nullptr,
"Get an iterator to the list of beams in this mission",
"iterator<beam>",
"An iterator across all beams in the mission. Can be used in a for .. in loop. Is not valid for more than one frame.")
{
size_t idx = 0;
return ade_set_args(L, "u", luacpp::LuaFunction::createFromStdFunction(L, [idx](lua_State* LInner, const luacpp::LuaValueList& /*params*/) mutable -> luacpp::LuaValueList {
// iterate through the Beams array to find the next active beam
while (idx < Beams.size()) {
const beam& b = Beams[idx];
idx++;
// inactive and freed beams both have objnum -1
if (b.objnum >= 0) {
if (!Objects[b.objnum].flags[Object::Object_Flags::Should_be_dead]) {
return luacpp::LuaValueList{ luacpp::LuaValue::createValue(LInner, l_Beam.Set(object_h(b.objnum))) };
}
}
}
// end of list or no more active beams found
return luacpp::LuaValueList{ luacpp::LuaValue::createNil(LInner) };
}));
}
ADE_FUNC(getAsteroidList,
l_Mission,
nullptr,
@@ -3260,62 +3204,6 @@ ADE_FUNC(getDebrisList,
}));
}
ADE_FUNC(getFireballList,
l_Mission,
nullptr,
"Get an iterator to the list of fireballs in this mission",
"iterator<fireball>",
"An iterator across all fireballs in the mission. Can be used in a for .. in loop. Is not valid for more than one frame.")
{
size_t idx = 0;
return ade_set_args(L, "u", luacpp::LuaFunction::createFromStdFunction(L, [idx](lua_State* LInner, const luacpp::LuaValueList& /*params*/) mutable -> luacpp::LuaValueList {
// iterate through the Fireballs vector to find the next live fireball
while (idx < Fireballs.size()) {
const fireball& fb = Fireballs[idx];
idx++;
// deleted fireballs keep their slot with objnum -1
if (fb.objnum >= 0) {
if (!Objects[fb.objnum].flags[Object::Object_Flags::Should_be_dead]) {
return luacpp::LuaValueList{ luacpp::LuaValue::createValue(LInner, l_Fireball.Set(object_h(fb.objnum))) };
}
}
}
// end of list or no more live fireballs found
return luacpp::LuaValueList{ luacpp::LuaValue::createNil(LInner) };
}));
}
ADE_FUNC(getPropList,
l_Mission,
nullptr,
"Get an iterator to the list of props in this mission",
"iterator<prop>",
"An iterator across all props in the mission. Can be used in a for .. in loop. Is not valid for more than one frame.")
{
size_t idx = 0;
return ade_set_args(L, "u", luacpp::LuaFunction::createFromStdFunction(L, [idx](lua_State* LInner, const luacpp::LuaValueList& /*params*/) mutable -> luacpp::LuaValueList {
// iterate through the Props vector to find the next live prop
while (idx < Props.size()) {
const auto& opt_prop = Props[idx];
idx++;
// deleted props leave an empty optional behind
if (opt_prop.has_value() && opt_prop->objnum >= 0) {
if (!Objects[opt_prop->objnum].flags[Object::Object_Flags::Should_be_dead]) {
return luacpp::LuaValueList{ luacpp::LuaValue::createValue(LInner, l_Prop.Set(object_h(opt_prop->objnum))) };
}
}
}
// end of list or no more live props found
return luacpp::LuaValueList{ luacpp::LuaValue::createNil(LInner) };
}));
}
ADE_FUNC(waitAsync,
l_Mission,
"number seconds",
@@ -11,7 +11,7 @@
<p>Opens via <strong>View &rsaquo; Music Player</strong>.</p>
<p>Plays back music files from the game's music folder while you work, so you can
audition tracks without launching FreeSpace Open. Useful when choosing tracks for
<a href="MissionSpecsDialog.html">Mission Specs</a>,
<a href="MissionSpecDialog.html">Mission Specs</a>,
<a href="BriefingEditorDialog.html">Briefing</a>,
<a href="DebriefingDialog.html">Debriefing</a>, or
<a href="CommandBriefingDialog.html">Command Briefing</a>.</p>
@@ -0,0 +1,43 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Preferences - QtFRED Help</title>
<link rel="stylesheet" type="text/css" href="../css/help.css"/>
</head>
<body>
<nav class="breadcrumb"><a href="../index.html">QtFRED Help</a> &rsaquo; Tools &rsaquo; Preferences</nav>
<h1>Preferences</h1>
<p>Opens via <strong>File &rsaquo; Preferences</strong>.</p>
<p>Controls QtFRED editor settings. Changes take effect immediately; there is no
Apply button.</p>
<h2>General</h2>
<table>
<tr><th>Setting</th><th>Description</th></tr>
<tr><td>Move ships with arrow keys</td><td>When enabled, the arrow keys nudge
selected objects in the viewport instead of scrolling the view.</td></tr>
<tr><td>Check for errors on save</td><td>Runs the built-in mission error checker
automatically each time the mission is saved.</td></tr>
<tr><td>Show SEXP help tooltips</td><td>Displays documentation tooltips when
hovering over SEXP nodes in the condition and action trees.</td></tr>
<tr><td>Dark mode</td><td>Switches the editor UI to a dark color
theme.</td></tr>
</table>
<h2>Grid</h2>
<table>
<tr><th>Setting</th><th>Description</th></tr>
<tr><td>Grid plane</td><td>Which plane the editor grid lies on:
<kbd>XZ</kbd> (horizontal), <kbd>XY</kbd>, or <kbd>YZ</kbd>.</td></tr>
<tr><td>Grid center</td><td>The world-space coordinates of the grid's center
point.</td></tr>
<tr><td>Reset grid</td><td>Resets the grid plane and center to defaults.</td></tr>
</table>
<h2>Keybindings</h2>
<p>Lists every editor action alongside its current keyboard shortcut. Click a shortcut
field and press a new key combination to rebind it. Conflicts are highlighted.
Bindings are saved per-user and persist across sessions.</p>
</body>
</html>
+1
View File
@@ -68,6 +68,7 @@ covers the basics of mission creation, the editor dialogs, and advanced topics.<
<h3>Objects</h3>
<ul>
<li><a href="dialogs/FormWingDialog.html">Form Wing</a></li>
<li><a href="dialogs/JumpNodeEditorDialog.html">Jump Node Editor</a></li>
<li><a href="dialogs/ObjectOrientEditorDialog.html">Object Orientation</a></li>
<li><a href="dialogs/PropEditorDialog.html">Prop Editor</a></li>
-3
View File
@@ -10,7 +10,6 @@
<section title="Concepts">
<section title="AI" ref="concepts/ai.html"/>
<section title="Campaign Flow" ref="concepts/campaign-flow.html"/>
<section title="Custom Data" ref="concepts/custom-data.html"/>
<section title="IFF &amp; Teams" ref="concepts/iff.html"/>
<section title="Messages" ref="concepts/messages.html"/>
<section title="SEXPs" ref="concepts/sexps.html"/>
@@ -94,7 +93,6 @@
<keyword name="AI" id="concept.ai" ref="concepts/ai.html"/>
<keyword name="Messages" id="concept.messages" ref="concepts/messages.html"/>
<keyword name="Campaign Flow" id="concept.campaignflow" ref="concepts/campaign-flow.html"/>
<keyword name="Custom Data Concepts" id="concept.customdata" ref="concepts/custom-data.html"/>
<keyword name="Viewport" id="concept.viewport" ref="general/Viewport.html"/>
<keyword name="Toolbars" id="concept.toolbar" ref="general/Toolbars.html"/>
<keyword name="Custom Data" id="CustomDataDialog" ref="dialogs/CustomDataDialog.html"/>
@@ -160,7 +158,6 @@
<file>concepts/ai.html</file>
<file>concepts/messages.html</file>
<file>concepts/campaign-flow.html</file>
<file>concepts/custom-data.html</file>
<file>dialogs/CustomDataDialog.html</file>
<file>css/help.css</file>
<file>dialogs/AsteroidEditorDialog.html</file>
+2
View File
@@ -0,0 +1,2 @@
set(FSO_VERSION_REVISION 20261111)
set(FSO_VERSION_REVISION_STR 20261111_8ef44a411)