|
From: <fli...@li...> - 2026-02-10 20:56:23
|
Revision: 19341
http://sourceforge.net/p/flightgear/fgaddon/19341
Author: helijah
Date: 2026-02-09 16:51:01 +0000 (Mon, 09 Feb 2026)
Log Message:
-----------
S.P.A.D. VII : Fixed MP sound.
Added Paths:
-----------
branches/release-2020.3/Aircraft/SPAD-VII/AI/Aircraft/SPAD-VII/Models/Liveries/
branches/release-2020.3/Aircraft/SPAD-VII/Dialogs/config.xml
branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/noise.frag
branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/thrust-flame.eff
branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/thrustflame-ALS.frag
branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/thrustflame-ALS.vert
branches/release-2020.3/Aircraft/SPAD-VII/Nasal/dialogs.nas
branches/release-2020.3/Aircraft/SPAD-VII/Nasal/weapons.nas
Removed Paths:
-------------
branches/release-2020.3/Aircraft/SPAD-VII/AI/Aircraft/SPAD-VII/Models/Effects/
branches/release-2020.3/Aircraft/SPAD-VII/AI/Aircraft/SPAD-VII/Models/Interior/
Added: branches/release-2020.3/Aircraft/SPAD-VII/Dialogs/config.xml
===================================================================
--- branches/release-2020.3/Aircraft/SPAD-VII/Dialogs/config.xml (rev 0)
+++ branches/release-2020.3/Aircraft/SPAD-VII/Dialogs/config.xml 2026-02-09 16:51:01 UTC (rev 19341)
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<PropertyList>
+
+ <name>Configuration</name>
+ <layout>vbox</layout>
+ <modal>false</modal>
+ <draggable>true</draggable>
+ <resizable>false</resizable>
+
+ <group>
+
+ <layout>hbox</layout>
+
+ <empty>
+ <stretch>false</stretch>
+ </empty>
+ <text>
+ <label>Configuration</label>
+ </text>
+ <empty><stretch>true</stretch></empty>
+
+ <button>
+ <legend/>
+ <key>Esc</key>
+ <pref-width>16</pref-width>
+ <pref-height>16</pref-height>
+ <binding>
+ <command>nasal</command>
+ <script>spadvii.config_dlg.open()</script>
+ </binding>
+ <binding>
+ <command>dialog-update</command>
+ </binding>
+ <binding>
+ <command>dialog-close</command>
+ </binding>
+ </button>
+
+ </group>
+
+ <vrule/>
+
+ <group>
+
+ <layout>vbox</layout>
+ <button>
+ <row>0</row>
+ <legend> Reload Weapons </legend>
+ <binding>
+ <command>nasal</command>
+ <script>guns.reload_guns();</script>
+ </binding>
+ <binding>
+ <command>dialog-update</command>
+ </binding>
+ </button>
+
+ <button>
+ <row>0</row>
+ <legend>Weapons unlimited </legend>
+ <binding>
+ <command>nasal</command>
+ <script>guns.unlimited_guns();</script>
+ </binding>
+ <binding>
+ <command>dialog-update</command>
+ </binding>
+ </button>
+
+ </group>
+
+ <hrule/>
+
+ <button>
+ <legend>Close</legend>
+ <default>true</default>
+ <key>Esc</key>
+ <binding>
+ <command>nasal</command>
+ <script>spadvii.config_dlg.open()</script>
+ </binding>
+ <binding>
+ <command>dialog-apply</command>
+ </binding>
+ <binding>
+ <command>dialog-close</command>
+ </binding>
+ </button>
+
+</PropertyList>
Added: branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/noise.frag
===================================================================
--- branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/noise.frag (rev 0)
+++ branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/noise.frag 2026-02-09 16:51:01 UTC (rev 19341)
@@ -0,0 +1,261 @@
+// -*-C++-*-
+
+// This is a library of noise functions, taking a coordinate vector and a wavelength
+// as input and returning a number [0:1] as output.
+
+// * Noise2D(in vec2 coord, in float wavelength) is 2d Perlin noise
+// * Noise3D(in vec3 coord, in float wavelength) is 3d Perlin noise
+// * DotNoise2D(in vec2 coord, in float wavelength, in float fractionalMaxDotSize, in float dDensity)
+// is sparse dot noise and takes a dot density parameter
+// * DropletNoise2D(in vec2 coord, in float wavelength, in float fractionalMaxDotSize, in float dDensity)
+// is sparse dot noise modified to look like liquid and takes a dot density parameter
+// * VoronoiNoise2D(in vec2 coord, in float wavelength, in float xrand, in float yrand)
+// is a function mapping the terrain into random domains, based on Voronoi tiling of a regular grid
+// distorted with xrand and yrand
+// * SlopeLines2D(in vec2 coord, in vec2 gradDir, in float wavelength, in float steepness)
+// computes a semi-random set of lines along the direction of steepest descent, allowing to
+// simulate e.g. water erosion patterns
+// * Strata3D(in vec3 coord, in float wavelength, in float variation)
+// computers a vertically stratified random pattern, appropriate e.g. for rock textures
+
+// Thorsten Renk 2014
+
+#version 120
+
+float rand2D(in vec2 co) {
+ return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
+}
+
+float rand3D(in vec3 co) {
+ return fract(sin(dot(co.xyz ,vec3(12.9898,78.233,144.7272))) * 43758.5453);
+}
+
+float cosine_interpolate(in float a, in float b, in float x) {
+ float ft = x * 3.1415927;
+ float f = (1.0 - cos(ft)) * .5;
+
+ return a*(1.0-f) + b*f;
+}
+
+float simple_interpolate(in float a, in float b, in float x) {
+ return a + smoothstep(0.0,1.0,x) * (b-a);
+}
+
+float interpolatedNoise2D(in float x, in float y) {
+ float integer_x = x - fract(x);
+ float fractional_x = x - integer_x;
+
+ float integer_y = y - fract(y);
+ float fractional_y = y - integer_y;
+
+ float v1 = rand2D(vec2(integer_x, integer_y));
+ float v2 = rand2D(vec2(integer_x+1.0, integer_y));
+ float v3 = rand2D(vec2(integer_x, integer_y+1.0));
+ float v4 = rand2D(vec2(integer_x+1.0, integer_y +1.0));
+
+ float i1 = simple_interpolate(v1 , v2 , fractional_x);
+ float i2 = simple_interpolate(v3 , v4 , fractional_x);
+
+ return simple_interpolate(i1 , i2 , fractional_y);
+}
+
+float interpolatedNoise3D(in float x, in float y, in float z) {
+ float integer_x = x - fract(x);
+ float fractional_x = x - integer_x;
+
+ float integer_y = y - fract(y);
+ float fractional_y = y - integer_y;
+
+ float integer_z = z - fract(z);
+ float fractional_z = z - integer_z;
+
+ float v1 = rand3D(vec3(integer_x, integer_y, integer_z));
+ float v2 = rand3D(vec3(integer_x+1.0, integer_y, integer_z));
+ float v3 = rand3D(vec3(integer_x, integer_y+1.0, integer_z));
+ float v4 = rand3D(vec3(integer_x+1.0, integer_y +1.0, integer_z));
+
+ float v5 = rand3D(vec3(integer_x, integer_y, integer_z+1.0));
+ float v6 = rand3D(vec3(integer_x+1.0, integer_y, integer_z+1.0));
+ float v7 = rand3D(vec3(integer_x, integer_y+1.0, integer_z+1.0));
+ float v8 = rand3D(vec3(integer_x+1.0, integer_y +1.0, integer_z+1.0));
+
+ float i1 = simple_interpolate(v1,v5, fractional_z);
+ float i2 = simple_interpolate(v2,v6, fractional_z);
+ float i3 = simple_interpolate(v3,v7, fractional_z);
+ float i4 = simple_interpolate(v4,v8, fractional_z);
+
+ float ii1 = simple_interpolate(i1,i2,fractional_x);
+ float ii2 = simple_interpolate(i3,i4,fractional_x);
+
+ return simple_interpolate(ii1 , ii2 , fractional_y);
+}
+
+
+float Noise2D(in vec2 coord, in float wavelength) {
+ return interpolatedNoise2D(coord.x/wavelength, coord.y/wavelength);
+
+}
+
+float Noise3D(in vec3 coord, in float wavelength) {
+ return interpolatedNoise3D(coord.x/wavelength, coord.y/wavelength, coord.z/wavelength);
+}
+
+float dotNoise2D(in float x, in float y, in float fractionalMaxDotSize, in float dDensity) {
+ float integer_x = x - fract(x);
+ float fractional_x = x - integer_x;
+
+ float integer_y = y - fract(y);
+ float fractional_y = y - integer_y;
+
+ if (rand2D(vec2(integer_x+1.0, integer_y +1.0)) > dDensity)
+ {return 0.0;}
+
+ float xoffset = (rand2D(vec2(integer_x, integer_y)) -0.5);
+ float yoffset = (rand2D(vec2(integer_x+1.0, integer_y)) - 0.5);
+ float dotSize = 0.5 * fractionalMaxDotSize * max(0.25,rand2D(vec2(integer_x, integer_y+1.0)));
+
+ vec2 truePos = vec2 (0.5 + xoffset * (1.0 - 2.0 * dotSize) , 0.5 + yoffset * (1.0 -2.0 * dotSize));
+
+ float distance = length(truePos - vec2(fractional_x, fractional_y));
+
+ return 1.0 - smoothstep (0.3 * dotSize, 1.0* dotSize, distance);
+}
+
+float DotNoise2D(in vec2 coord, in float wavelength, in float fractionalMaxDotSize, in float dDensity) {
+ return dotNoise2D(coord.x/wavelength, coord.y/wavelength, fractionalMaxDotSize, dDensity);
+}
+
+float dropletNoise2D(in float x, in float y, in float fractionalMaxDotSize, in float dDensity) {
+ float integer_x = x - fract(x);
+ float fractional_x = x - integer_x;
+
+ float integer_y = y - fract(y);
+ float fractional_y = y - integer_y;
+
+ if (rand2D(vec2(integer_x+1.0, integer_y +1.0)) > dDensity) {
+ return 0.0;
+ }
+
+ float xoffset = (rand2D(vec2(integer_x, integer_y)) -0.5);
+ float yoffset = (rand2D(vec2(integer_x+1.0, integer_y)) - 0.5);
+ float dotSize = 0.5 * fractionalMaxDotSize * max(0.25,rand2D(vec2(integer_x, integer_y+1.0)));
+
+ float x1offset = 2.0 * (rand2D(vec2(integer_x+5.0, integer_y)) -0.5);
+ float y1offset = 2.0 * (rand2D(vec2(integer_x, integer_y + 5.0)) - 0.5);
+ float x2offset = 2.0 * (rand2D(vec2(integer_x-5.0, integer_y)) -0.5);
+ float y2offset = 2.0 * (rand2D(vec2(integer_x-5.0, integer_y -5.0)) - 0.5);
+ float smear = (rand2D(vec2(integer_x + 3.0, integer_y)) -0.5);
+
+ vec2 truePos = vec2 (0.5 + xoffset * (1.0 - 4.0 * dotSize) , 0.5 + yoffset * (1.0 -4.0 * dotSize));
+ vec2 secondPos = truePos + vec2 (dotSize * x1offset, dotSize * y1offset);
+ vec2 thirdPos = truePos + vec2 (dotSize * x2offset, dotSize * y2offset);
+
+ float distance = length(truePos - vec2(fractional_x, fractional_y));
+ float dist1 = length(secondPos - vec2(fractional_x, fractional_y));
+ float dist2 = length(thirdPos - vec2(fractional_x, fractional_y));
+
+ return clamp(3.0 - smoothstep (0.3 * dotSize, 1.0* dotSize, distance) - smoothstep (0.3 * dotSize, 1.0* dotSize, dist1) - smoothstep ((0.1 + 0.5 * smear) * dotSize, 1.0* dotSize, dist2), 0.0,1.0);
+}
+
+float DropletNoise2D(in vec2 coord, in float wavelength, in float fractionalMaxDotSize, in float dDensity) {
+ return dropletNoise2D(coord.x/wavelength, coord.y/wavelength, fractionalMaxDotSize, dDensity);
+}
+
+float voronoiNoise2D(in float x, in float y, in float xrand, in float yrand) {
+ float integer_x = x - fract(x);
+ float fractional_x = x - integer_x;
+
+ float integer_y = y - fract(y);
+ float fractional_y = y - integer_y;
+
+ float val[4];
+
+ val[0] = rand2D(vec2(integer_x, integer_y));
+ val[1] = rand2D(vec2(integer_x+1.0, integer_y));
+ val[2] = rand2D(vec2(integer_x, integer_y+1.0));
+ val[3] = rand2D(vec2(integer_x+1.0, integer_y+1.0));
+
+ float xshift[4];
+
+ xshift[0] = xrand * (rand2D(vec2(integer_x+0.5, integer_y)) - 0.5);
+ xshift[1] = xrand * (rand2D(vec2(integer_x+1.5, integer_y)) -0.5);
+ xshift[2] = xrand * (rand2D(vec2(integer_x+0.5, integer_y+1.0))-0.5);
+ xshift[3] = xrand * (rand2D(vec2(integer_x+1.5, integer_y+1.0))-0.5);
+
+ float yshift[4];
+
+ yshift[0] = yrand * (rand2D(vec2(integer_x, integer_y +0.5)) - 0.5);
+ yshift[1] = yrand * (rand2D(vec2(integer_x+1.0, integer_y+0.5)) -0.5);
+ yshift[2] = yrand * (rand2D(vec2(integer_x, integer_y+1.5))-0.5);
+ yshift[3] = yrand * (rand2D(vec2(integer_x+1.5, integer_y+1.5))-0.5);
+
+ float dist[4];
+
+ dist[0] = sqrt((fractional_x + xshift[0]) * (fractional_x + xshift[0]) + (fractional_y + yshift[0]) * (fractional_y + yshift[0]));
+ dist[1] = sqrt((1.0 -fractional_x + xshift[1]) * (1.0-fractional_x+xshift[1]) + (fractional_y +yshift[1]) * (fractional_y+yshift[1]));
+ dist[2] = sqrt((fractional_x + xshift[2]) * (fractional_x + xshift[2]) + (1.0-fractional_y +yshift[2]) * (1.0-fractional_y + yshift[2]));
+ dist[3] = sqrt((1.0-fractional_x + xshift[3]) * (1.0-fractional_x + xshift[3]) + (1.0-fractional_y +yshift[3]) * (1.0-fractional_y + yshift[3]));
+
+ int i, i_min;
+ float dist_min = 100.0;
+ for (i=0; i<4;i++) {
+ if (dist[i] < dist_min) {
+ dist_min = dist[i];
+ i_min = i;
+ }
+ }
+
+ return val[i_min];
+ //return val[0];
+}
+
+float VoronoiNoise2D(in vec2 coord, in float wavelength, in float xrand, in float yrand) {
+ return voronoiNoise2D(coord.x/wavelength, coord.y/wavelength, xrand, yrand);
+}
+
+float slopeLines2D(in float x, in float y, in float sx, in float sy, in float steepness) {
+ float integer_x = x - fract(x);
+ float fractional_x = x - integer_x;
+
+ float integer_y = y - fract(y);
+ float fractional_y = y - integer_y;
+
+ vec2 O = vec2 (0.2 + 0.6* rand2D(vec2 (integer_x, integer_y+1)), 0.3 + 0.4* rand2D(vec2 (integer_x+1, integer_y)));
+ vec2 S = vec2 (sx, sy);
+ vec2 P = vec2 (-sy, sx);
+ vec2 X = vec2 (fractional_x, fractional_y);
+
+ float radius = 0.0 + 0.3 * rand2D(vec2 (integer_x, integer_y));
+
+ float b = (X.y - O.y + O.x * S.y/S.x - X.x * S.y/S.x) / (P.y - P.x * S.y/S.x);
+ float a = (X.x - O.x - b*P.x)/S.x;
+
+ return (1.0 - smoothstep(0.7 * (1.0-steepness), 1.2* (1.0 - steepness), 0.6* abs(a))) * (1.0 - smoothstep(0.0, 1.0 * radius,abs(b)));
+}
+
+float SlopeLines2D(in vec2 coord, in vec2 gradDir, in float wavelength, in float steepness) {
+ return slopeLines2D(coord.x/wavelength, coord.y/wavelength, gradDir.x, gradDir.y, steepness);
+}
+
+float strata3D(in float x, in float y, in float z, in float variation) {
+ float integer_x = x - fract(x);
+ float fractional_x = x - integer_x;
+
+ float integer_y = y - fract(y);
+ float fractional_y = y - integer_y;
+
+ float integer_z = z - fract(z);
+ float fractional_z = z - integer_z;
+
+ float rand_value_low = rand3D(vec3(0.0, 0.0, integer_z));
+ float rand_value_high = rand3D(vec3(0.0, 0.0, integer_z+1));
+
+ float rand_var = 0.5 - variation + 2.0 * variation * rand3D(vec3(integer_x, integer_y, integer_z));
+
+ return (1.0 - smoothstep(rand_var -0.15, rand_var + 0.15, fract(z))) * rand_value_low + smoothstep(rand_var-0.15, rand_var + 0.15, fract(z)) * rand_value_high;
+}
+
+
+float Strata3D(in vec3 coord, in float wavelength, in float variation) {
+ return strata3D(coord.x/wavelength, coord.y/wavelength, coord.z/wavelength, variation);
+}
Added: branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/thrust-flame.eff
===================================================================
--- branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/thrust-flame.eff (rev 0)
+++ branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/thrust-flame.eff 2026-02-09 16:51:01 UTC (rev 19341)
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<PropertyList>
+
+ <name>thrust-flame</name>
+
+ <parameters>
+ <texture n="0">
+ <type>white</type>
+ </texture>
+
+ <flame_radius_fraction type="float">0.2</flame_radius_fraction>
+ <thrust_collimation type="float">0.1</thrust_collimation>
+ <thrust_density type="float">0.5</thrust_density>
+ <base_flame_density type="float">1.0</base_flame_density>
+ <shock_frequency type="float">0.5</shock_frequency>
+ <noise_strength type="float">0.2</noise_strength>
+ <noise_scale type="float">0.1</noise_scale>
+ <flame_color_low_r type="float">0.95</flame_color_low_r>
+ <flame_color_low_g type="float">0.55</flame_color_low_g>
+ <flame_color_low_b type="float">0.0</flame_color_low_b>
+ <flame_color_high_r type="float">1.0</flame_color_high_r>
+ <flame_color_high_g type="float">0.8</flame_color_high_g>
+ <flame_color_high_b type="float">0.3</flame_color_high_b>
+ <base_flame_r type="float">1.0</base_flame_r>
+ <base_flame_g type="float">0.8</base_flame_g>
+ <base_flame_b type="float">0.3</base_flame_b>
+ <random_seed type="float">0.0</random_seed>
+ <deflection_coeff type="float">0.0</deflection_coeff>
+ <use_shocks type="int">1</use_shocks>
+ <use_noise type="int">1</use_noise>
+ <visibility><use>/environment/ground-visibility-m</use></visibility>
+ <avisibility><use>/environment/visibility-m</use></avisibility>
+ <lthickness><use>/environment/ground-haze-thickness-m</use></lthickness>
+ <terrain_alt><use>/environment/mean-terrain-elevation-m</use></terrain_alt>
+ <eye_alt><use>/sim/rendering/eye-altitude-m</use></eye_alt>
+ </parameters>
+
+ <technique n="4">
+
+ <predicate>
+ <and>
+ <property>/sim/rendering/shaders/skydome</property>
+ <or>
+ <less-equal>
+ <value type="float">2.0</value>
+ <glversion/>
+ </less-equal>
+ <and>
+ <extension-supported>GL_ARB_shader_objects</extension-supported>
+ <extension-supported>GL_ARB_shading_language_100</extension-supported>
+ <extension-supported>GL_ARB_vertex_shader</extension-supported>
+ <extension-supported>GL_ARB_fragment_shader</extension-supported>
+ </and>
+ </or>
+ </and>
+ </predicate>
+
+ <pass>
+
+ <lighting>true</lighting>
+
+ <material>
+ <active><use>material/active</use></active>
+ <ambient><use>material/ambient</use></ambient>
+ <diffuse><use>material/diffuse</use></diffuse>
+ <specular><use>material/specular</use></specular>
+ <emissive><use>material/emissive</use></emissive>
+ <shininess><use>material/shininess</use></shininess>
+ <color-mode><use>material/color-mode</use></color-mode>
+ </material>
+
+ <blend>
+ <active><use>blend/active</use></active>
+ <source><use>blend/source</use></source>
+ <destination><use>blend/destination</use></destination>
+ </blend>
+
+ <shade-model><use>shade-model</use></shade-model>
+ <cull-face><use>cull-face</use></cull-face>
+ <rendering-hint><use>rendering-hint</use></rendering-hint>
+
+ <render-bin>
+ <bin-number>111</bin-number>
+ <bin-name>DepthSortedBin</bin-name>
+ </render-bin>
+
+ <texture-unit>
+ <!-- The texture unit is always active because the shaders expect
+ that. -->
+ <unit>0</unit>
+ <active><use>texture[0]/active</use></active>
+ <type><use>texture[0]/type</use></type>
+ <image><use>texture[0]/image</use></image>
+ <filter><use>texture[0]/filter</use></filter>
+ <wrap-s><use>texture[0]/wrap-s</use></wrap-s>
+ <wrap-t><use>texture[0]/wrap-t</use></wrap-t>
+ <internal-format>
+ <use>texture[0]/internal-format</use>
+ </internal-format>
+ </texture-unit>
+
+ <depth>
+ <write-mask>false</write-mask>
+ </depth>
+
+ <vertex-program-two-side>false</vertex-program-two-side>
+
+ <program>
+ <vertex-shader>thrustflame-ALS.vert</vertex-shader>
+ <fragment-shader>thrustflame-ALS.frag</fragment-shader>
+ <fragment-shader>noise.frag</fragment-shader>
+ </program>
+
+ <uniform>
+ <name>flame_radius_fraction</name>
+ <type>float</type>
+ <value><use>flame_radius_fraction</use></value>
+ </uniform>
+
+ <uniform>
+ <name>thrust_collimation</name>
+ <type>float</type>
+ <value><use>thrust_collimation</use></value>
+ </uniform>
+
+ <uniform>
+ <name>thrust_density</name>
+ <type>float</type>
+ <value><use>thrust_density</use></value>
+ </uniform>
+
+ <uniform>
+ <name>base_flame_density</name>
+ <type>float</type>
+ <value><use>base_flame_density</use></value>
+ </uniform>
+
+ <uniform>
+ <name>shock_frequency</name>
+ <type>float</type>
+ <value><use>shock_frequency</use></value>
+ </uniform>
+
+ <uniform>
+ <name>noise_strength</name>
+ <type>float</type>
+ <value><use>noise_strength</use></value>
+ </uniform>
+
+ <uniform>
+ <name>noise_scale</name>
+ <type>float</type>
+ <value><use>noise_scale</use></value>
+ </uniform>
+
+ <uniform>
+ <name>random_seed</name>
+ <type>float</type>
+ <value><use>random_seed</use></value>
+ </uniform>
+
+ <uniform>
+ <name>flame_color_low_r</name>
+ <type>float</type>
+ <value><use>flame_color_low_r</use></value>
+ </uniform>
+
+ <uniform>
+ <name>flame_color_low_g</name>
+ <type>float</type>
+ <value><use>flame_color_low_g</use></value>
+ </uniform>
+
+ <uniform>
+ <name>flame_color_low_b</name>
+ <type>float</type>
+ <value><use>flame_color_low_b</use></value>
+ </uniform>
+
+ <uniform>
+ <name>flame_color_high_r</name>
+ <type>float</type>
+ <value><use>flame_color_high_r</use></value>
+ </uniform>
+
+ <uniform>
+ <name>flame_color_high_g</name>
+ <type>float</type>
+ <value><use>flame_color_high_g</use></value>
+ </uniform>
+
+ <uniform>
+ <name>flame_color_high_b</name>
+ <type>float</type>
+ <value><use>flame_color_high_b</use></value>
+ </uniform>
+
+ <uniform>
+ <name>base_flame_r</name>
+ <type>float</type>
+ <value><use>base_flame_r</use></value>
+ </uniform>
+
+ <uniform>
+ <name>base_flame_g</name>
+ <type>float</type>
+ <value><use>base_flame_g</use></value>
+ </uniform>
+
+ <uniform>
+ <name>base_flame_b</name>
+ <type>float</type>
+ <value><use>base_flame_b</use></value>
+ </uniform>
+
+ <uniform>
+ <name>deflection_coeff</name>
+ <type>float</type>
+ <value><use>deflection_coeff</use></value>
+ </uniform>
+
+ <uniform>
+ <name>use_shocks</name>
+ <type>int</type>
+ <value><use>use_shocks</use></value>
+ </uniform>
+
+ <uniform>
+ <name>use_noise</name>
+ <type>int</type>
+ <value><use>use_noise</use></value>
+ </uniform>
+
+ <uniform>
+ <name>texture</name>
+ <type>sampler-2d</type>
+ <value type="int">0</value>
+ </uniform>
+
+ <uniform>
+ <name>colorMode</name>
+ <type>int</type>
+ <value><use>material/color-mode-uniform</use></value>
+ </uniform>
+
+ </pass>
+
+ </technique>
+
+</PropertyList>
Added: branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/thrustflame-ALS.frag
===================================================================
--- branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/thrustflame-ALS.frag (rev 0)
+++ branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/thrustflame-ALS.frag 2026-02-09 16:51:01 UTC (rev 19341)
@@ -0,0 +1,135 @@
+// -*-C++-*-
+
+#version 120
+
+varying vec3 vertex;
+varying vec3 viewDir;
+
+uniform float osg_SimulationTime;
+uniform float thrust_collimation;
+uniform float flame_radius_fraction;
+uniform float thrust_density;
+uniform float base_flame_density;
+uniform float shock_frequency;
+uniform float noise_strength;
+uniform float noise_scale;
+uniform float deflection_coeff;
+uniform float random_seed;
+
+uniform float flame_color_low_r;
+uniform float flame_color_low_g;
+uniform float flame_color_low_b;
+
+uniform float flame_color_high_r;
+uniform float flame_color_high_g;
+uniform float flame_color_high_b;
+
+uniform float base_flame_r;
+uniform float base_flame_g;
+uniform float base_flame_b;
+
+uniform int use_shocks;
+uniform int use_noise;
+
+float Noise2D(in vec2 coord, in float wavelength);
+
+const int n_steps = 15;
+
+float spherical_smoothstep (in vec3 pos) {
+
+ float l = length(vec3 (pos.x/2.0, pos.y,pos.z) );
+
+ return 10.0 * thrust_density * base_flame_density * (1.0 - smoothstep(0.5* flame_radius_fraction, flame_radius_fraction, l));
+}
+
+float thrust_flame (in vec3 pos) {
+
+ float noise = 0.0;
+
+ pos.z +=8.0 * deflection_coeff;
+
+ float d_rad = length(pos.yz - vec2 (0.0, deflection_coeff * pos.x * pos.x));
+ //float longFade = smoothstep(0.0, 5.0, pos.x) ;
+ float longFade = pos.x/5.0;
+
+ float density = 1.0 - longFade;
+ float radius = flame_radius_fraction + thrust_collimation * 1.0 * pow((pos.x+0.1),0.5);
+
+ if (d_rad > radius) {
+ return 0.0;
+ }
+
+ if (use_noise ==1) {
+ noise = Noise2D(vec2(pos.x - osg_SimulationTime * 30.0 + random_seed , d_rad), noise_scale);
+ }
+
+ density *= (1.0 - smoothstep(0.125, radius, d_rad)) * (1.0 - noise_strength + noise_strength* noise);
+
+ if (use_shocks == 1) {
+ float shock = sin(pos.x * 10.0 * shock_frequency);
+ density += shock * shock * shock * shock * (1.0 - longFade) * (1.0 - smoothstep(0.25*flame_radius_fraction, 0.5*flame_radius_fraction, d_rad)) * (1.0 - smoothstep(0.0, 1.0, thrust_collimation)) * (1.0 + 0.5 * base_flame_density);
+ }
+
+ return 10.0 * thrust_density * density / (radius/0.2);
+}
+
+void main() {
+
+ vec3 vDir = normalize(viewDir);
+
+ float x_E, y_E, z_E;
+
+ if (vDir.x > 0.0) {
+ x_E = 5.0;
+ } else {
+ x_E = 0.0;
+ }
+ if (vDir.y > 0.0) {
+ y_E = 1.0;
+ } else {
+ y_E = -1.0;
+ }
+ if (vDir.z > 0.0) {
+ z_E = 1.0;
+ } else {
+ z_E = -1.0;
+ }
+
+ float t_x = (x_E - vertex.x) / vDir.x;
+ float t_y = (y_E - vertex.y) / vDir.y;
+ float t_z = (z_E - vertex.z) / vDir.z;
+
+ float t_min = min(t_x, t_y);
+ t_min = min(t_min, t_z);
+
+ float dt = t_min / float(n_steps);
+
+ vec3 step = viewDir * dt;
+ vec3 pos = vertex;
+
+ float density1 = 0.0;
+ float density2 = 0.0;
+
+ for (int i = 0; i < n_steps; i++) {
+ pos = pos + step;
+ density1 += spherical_smoothstep(pos) * dt;
+ density2 += thrust_flame(pos) * dt;
+ }
+
+ float density = density1 + density2;
+ //density = clamp(density,0.0,1.0);
+ density = 1.0 - exp(-density);
+
+ density1 = 1.0 - exp(-density1);
+ density2 = 1.0 - exp(-density2);
+
+ vec3 flame_color_low = vec3 (flame_color_low_r, flame_color_low_g, flame_color_low_b);
+ vec3 flame_color_high = vec3 (flame_color_high_r, flame_color_high_g, flame_color_high_b);
+
+ vec3 color = mix(flame_color_low, flame_color_high, density2);
+ color = mix(color, vec3(base_flame_r, base_flame_g, base_flame_b), density1);
+
+ vec4 finalColor = vec4 (color.rgb, density);
+
+ gl_FragColor = finalColor;
+}
Added: branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/thrustflame-ALS.vert
===================================================================
--- branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/thrustflame-ALS.vert (rev 0)
+++ branches/release-2020.3/Aircraft/SPAD-VII/Models/Effects/Weapons/guns/thrustflame-ALS.vert 2026-02-09 16:51:01 UTC (rev 19341)
@@ -0,0 +1,20 @@
+// -*-C++-*-
+
+#version 120
+
+varying vec3 vertex;
+varying vec3 viewDir;
+
+void main() {
+
+ vec4 ep = gl_ModelViewMatrixInverse * vec4(0.0,0.0,0.0,1.0);
+
+ vertex = gl_Vertex.xyz;
+ viewDir = normalize(vertex - ep.xyz);
+
+ gl_Position = ftransform();
+ gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
+
+ gl_FrontColor = vec4 (1.0,1.0,1.0,1.0);
+ gl_BackColor = gl_FrontColor;
+}
Added: branches/release-2020.3/Aircraft/SPAD-VII/Nasal/dialogs.nas
===================================================================
--- branches/release-2020.3/Aircraft/SPAD-VII/Nasal/dialogs.nas (rev 0)
+++ branches/release-2020.3/Aircraft/SPAD-VII/Nasal/dialogs.nas 2026-02-09 16:51:01 UTC (rev 19341)
@@ -0,0 +1 @@
+var config_dlg = gui.Dialog.new("/sim/gui/dialogs/config/dialog", "Aircraft/SPAD-VII/Dialogs/config.xml");
Added: branches/release-2020.3/Aircraft/SPAD-VII/Nasal/weapons.nas
===================================================================
--- branches/release-2020.3/Aircraft/SPAD-VII/Nasal/weapons.nas (rev 0)
+++ branches/release-2020.3/Aircraft/SPAD-VII/Nasal/weapons.nas 2026-02-09 16:51:01 UTC (rev 19341)
@@ -0,0 +1,69 @@
+#########################################################
+############## General initializers #####################
+#########################################################
+# Guns
+var n_gun1_ammo_count = "ai/submodels/submodel[0]/count";
+
+#########################################################
+##################### reload guns #######################
+#########################################################
+# Guns generally cannot be reloaded in flight. It requires landing,
+# stop, and reload before taking off again.
+#
+# Note that tracers are modeled as bullets that include a visual model but
+# no impact. They fire along with 1 of every three or four bullets to simulate
+# a tracer round every 4 rounds.
+
+reload_guns = func {
+
+ var groundspeed = getprop("velocities/groundspeed-kt");
+
+ # only allow it if on ground or if it's already set to unlimited mode
+ if ( groundspeed < 5 or getprop( r_gun1_ammo_count) == -1 ) {
+
+ # Guns
+ setprop(n_gun1_ammo_count, 400);
+
+ gui.popupTip ("Guns reloaded--400 rounds in each gun.", 5);
+ } else {
+ gui.popupTip ("You must be on the ground and engines dead stopped to re-load guns.",5);
+ }
+}
+
+#########################################################
+################ unlimited ammo #########################
+#########################################################
+# For testing only, of course!
+#
+
+unlimited_guns = func {
+
+ var groundspeed = getprop("velocities/groundspeed-kt");
+
+ # Guns
+ setprop (n_gun1_ammo_count, -1);
+
+ gui.popupTip ("Guns set to unlimited mode--definitely not realistic and only for testing! Select 'Reload Guns' to revert to limited ammo.",7);
+}
+
+######################################################################
+### ###
+### Guns fire only if view is done ###
+### ###
+### BARANGER Emmanuel aka Helijah 04/10/2024 ###
+### 03/01/2025 ###
+### 26/01/2025 ###
+### 02/02/2025 for B17 ###
+### 30/07/2025 for Ju 87 ###
+### 09/02/2026 for SPAD VII ###
+######################################################################
+
+fire_MG = func {
+ # setprop("/controls/armament/trigger", 1);
+ setprop("sim/multiplay/generic/int[10]", 1);
+}
+
+stop_MG = func {
+ # setprop("/controls/armament/trigger", 0);
+ setprop("sim/multiplay/generic/int[10]", 0);
+}
|