This is an old revision of the document!
Audience: Arma 3 addon authors integrating the RKSL CVWP GPS/release system into a third-party aircraft display. Reference state: CVWP GPS V19E production cleanup, 5 October 2026. Examples: static HUD, helmet-mounted display (HMD), and UAV/sensor turret optics.
The GPS/release solver belongs to rksla3-cvwp. Your aircraft addon should only provide a presentation layer.
CVWP
GPS target / queue
selected weapon binding
release constraints
dynamic RMIN / RMAX
release-ready state
scripted guidance
|
+--> Static HUD adapter (aircraft/HUD-relative)
+--> HMD adapter (head/view-relative target projection)
+--> UAV turret optics (CVWP-owned RscInGameUI resource)
Do not copy the CVWP GPS solver, queue code, release predictor or guidance loop into your aircraft addon. If you find yourself reimplementing weapon physics in the display addon, the integration has gone wrong.
The aircraft/display addon owns only:
rksla3_cvwp;Your addon must load after CVWP:
class CfgPatches { class MyAircraft_CVWP_GPS_Patch { requiredAddons[] = { "MyAircraft_Base_Addon", "rksla3_cvwp" }; units[] = {}; weapons[] = {}; }; };
For aircraft class MFD integrations, ensure mfdMaxUserValues is large enough for the channels you allocate. The supplied static/HMD examples use channels up to user206, so use at least:
mfdMaxUserValues = 207;
If the aircraft already has a larger value, do not reduce it.
The selected ammunition must participate in the CVWP GPS system. For CVWP weapons this is generated by the Config Factory. The basic capability marker is:
RKSLGPS = 1;
Guided-ballistic and glide weapons require the appropriate additional CVWP guidance profile; do not invent those values in the aircraft HUD patch.
For bespoke HUD/HMD integrations, use:
private _solution = [_vehicle] call RKSLA3_CVWP_fnc_targetCueGetSolution;
targetCueGetSolution is the canonical display source. Treat it as an append-only array and read fields with param defaults rather than assuming every older CVWP build has every extension.
| Index | Field | Type | Notes |
|---|---|---|---|
| 0 | active | BOOL | Valid selected weapon + active target |
| 1 | source | STRING | Currently GPS or NONE for this use |
| 2 | targetASL | ARRAY | World target position ASL |
| 3 | range | NUMBER | Slant range in metres |
| 4 | offBore | NUMBER | Release/off-boresight angle in degrees |
| 5 | releaseReady | BOOL | CVWP release decision |
| 6 | constraint | STRING | OK, RNG, ANG, ALT, etc. |
| 7 | queueIndex | NUMBER | Current queue item |
| 8 | queueCount | NUMBER | Original queue count |
| 9 | queueText | STRING | e.g. Q 2/4 |
| 10 | weapon | STRING | Selected weapon class |
| 11 | magazine | STRING | Selected magazine class |
| 12 | ammo | STRING | Resolved ammunition class |
| 13 | tof | NUMBER | Predicted time of flight, when available |
| 14 | predictedMiss | NUMBER | Predictor output |
| 15 | allowedMiss | NUMBER | Allowed predictor miss |
| 16 | predictedCorrectionDemand | NUMBER | Normalised pre-release correction demand |
| 17 | requiredAlongCorrection | NUMBER | Metres |
| 18 | requiredCrossCorrection | NUMBER | Metres |
| 19 | naturalImpactASL | ARRAY | Predicted unguided impact point |
| 20 | dynamicRMin | NUMBER | Current shared near release boundary |
| 21 | dynamicRMax | NUMBER | Current shared far release boundary |
| 22 | usableAuthority | NUMBER | Usable guidance authority fraction |
| 23 | longitudinalDemandSigned | NUMBER | Signed normalised demand |
| 24 | lateralDemandSigned | NUMBER | Signed normalised demand |
For normal production presentation, most integrations only need indices 0-6, 10-13, 20 and 21.
The validated aircraft displays use the same basic information even though they project it differently:
releaseReady and constraint directly.
The display rail does not make the release decision. releaseReady remains authoritative.
For ballistic/glide stores, prefer CVWP's dynamicRMin / dynamicRMax. For powered/native GPS stores that do not publish a dynamic ballistic envelope, an aircraft adapter may use the configured release min/max as a presentation-only fallback by calling:
private _release = [_weapon,"","",_ammo,_magazine] call RKSLA3_CVWP_fnc_gpsReleaseSettings;
Do not use the fallback to override a CVWP release inhibit.
A static HUD is physically attached to the aircraft. The GPS cue must move when the aircraft moves, not when the pilot free-looks.
The tested reference is the Gripen C implementation.
The active HUD class should use the model's combiner memory points and should not be configured as an HMD:
topLeft = "hud_tl"; topRight = "hud_tr"; bottomLeft = "hud_ll"; enableParallax = 0; helmetMountedDisplay = 0;
Use the actual memory-point names from your model.
The example package contains:
cvwp_gps_static_hud_example/ config.cpp.example functions/fn_staticHudInit.sqf functions/fn_staticHudUpdate.sqf includes/cvwp_gps_static_bones.hpp includes/cvwp_gps_static_draw.hpp
The adapter reads targetCueGetSolution and publishes local user / userText values. It does not modify CVWP.
Inside the existing static HUD MFD class, merge the supplied bones into class Bones and the supplied draw group into class Draw.
Do not replace the aircraft's whole class MFD just to add CVWP symbology.
The critical rule is: do not use worldToScreen for a fixed HUD target gate.
The example converts the target line-of-sight into the aircraft's forward/right/up frame:
private _los = vectorNormalized (_targetASL vectorDiff (getPosASL _veh)); private _forward = vectorNormalized (vectorDir _veh); private _up = vectorNormalized (vectorUp _veh); private _right = vectorNormalized (_forward vectorCrossProduct _up); private _f = _los vectorDotProduct _forward; private _r = _los vectorDotProduct _right; private _u = _los vectorDotProduct _up;
It then converts horizontal/vertical angles to local HUD coordinates.
If your existing HUD has a known angular bone such as a Pos10Vector, measure the local coordinate displacement for 10 degrees and divide by 10.
Example vehicle hooks supplied by the plugin:
CVWPGPS_StaticHUD_XPerDegree = 0.0725; CVWPGPS_StaticHUD_YPerDegree = 0.0600; CVWPGPS_StaticHUD_EdgeMargin = 0.045;
These are display calibration values, not weapon physics.
If the cue follows the pilot's head, you have accidentally implemented HMD/screen-space projection rather than a static HUD.
An HMD is different: the target cue is world-registered to the pilot's current view. The tested reference is the StavJet implementation.
The clean separation is:
Use the aircraft's existing helmet-mounted MFD/HMD class. Do not convert a static HUD into an HMD just to make the GPS cue easy to draw.
The example package contains:
cvwp_gps_hmd_example/ config.cpp.example functions/fn_hmdInit.sqf functions/fn_hmdUpdate.sqf includes/cvwp_gps_hmd_bones.hpp includes/cvwp_gps_hmd_draw.hpp
For an HMD, worldToScreen is appropriate because the pilot's view direction is part of the display geometry:
private _screen = worldToScreen (ASLToAGL _targetASL);
The example updates target X/Y every frame but throttles the heavier CVWP release solution refresh. This avoids visible stepping without running the full solver unnecessarily at render rate.
Do not parent the LAR and status block to the moving target gate. LAR/XTRK/status should remain at fixed HMD coordinates while the world target gate moves as the pilot turns their head.
For a UAV sensor turret, do not build another copy of the MQ-9 HUD scripts. CVWP owns a reusable sensor-operator optics resource.
CVWP provides:
RKSLA3_CVWP_UAVHUD_GunnerOptics RKSLA3_CVWP_UAVHUD_PilotReleaseOverlay
and the function/runtime namespace:
RKSLA3_CVWP_fnc_uavHud* RKSLA3_CVWP_UAVHUD_*
class RscInGameUI { class RKSLA3_CVWP_UAVHUD_GunnerOptics; class MyUAV_GunnerOptics: RKSLA3_CVWP_UAVHUD_GunnerOptics { // Vehicle-specific visual overrides only. }; };
Merge into the target addon's real resolved turret hierarchy:
turretInfoType = "MyUAV_GunnerOptics";
Do not blindly replace the entire Turrets block; preserve inherited weapons, optics, stabilisation, animation sources and sensors.
RKSLA3_CVWP_UAVHUD_APIRequired = 1;
Optional pilot overlay:
RKSLA3_CVWP_UAVHUD_EnablePilotOverlay = 1; RKSLA3_CVWP_UAVHUD_PilotOverlayClass = "MyUAV_PilotReleaseOverlay";
If you only need the turret/sensor HUD, leave the pilot overlay disabled.
The UAV framework supports platform-local projected-gate tuning. Start with the reference values only if needed:
RKSLHudProjectedGateTransformMode = 4; RKSLHudProjectedGateSmoothing = 0.18; RKSLHudProjectedGateDeadzone = 0.003; RKSLHudProjectedGateMaxStep = 0.08; RKSLHudProjectedGateResetDistance = 15;
Keep platform tuning in the UAV addon. Do not fork fn_uavHud*.sqf.
Production CVWP ships with heavy GPS diagnostics disabled:
class RKSLA3_CVWP_GPS { debug = 0; };
When deliberately diagnosing release/guidance behaviour, enable the master debug switch for the test build/mission:
class RKSLA3_CVWP_GPS { debug = 1; };
This restores the V19D/V19E release correlation, ballistic path diagnostics, 3D markers and development hints. Do not leave it enabled in a normal release build.
| Symptom | Cause | Fix |
|---|---|---|
| Fixed HUD follows free-look | Camera / worldToScreen projection used on static HUD | Use aircraft forward/right/up projection |
| HMD target gate stays glued to helmet centre | Aircraft-relative projection used for world cue | Use per-frame worldToScreen for the gate |
| LAR disappears intermittently despite valid solution | Display cache being treated as authority | Use shared dynamic RMIN/RMAX as authoritative display fallback |
| RDY differs from CVWP | Aircraft addon re-derived release logic | Display releaseReady / constraint directly |
| Existing HUD symbology disappears | Whole class MFD was replaced | Merge into resolved inherited MFD hierarchy |
| Existing UAV turret breaks | Whole Turrets block was replaced | Patch the exact nested turret class only |
No entry … sourceScale | Text MFD class omitted required source field | Use sourceScale = 1 for userText classes |
| Cue judders | Projection updated only at slow solver rate | Split solver refresh from render-frame projection |
| User channels collide | Existing avionics already uses selected values | Allocate unused user/userText channels and adjust both SQF and MFD fragment |
The companion ZIP contains three source templates:
examples/ cvwp_gps_static_hud_example/ cvwp_gps_hmd_example/ cvwp_gps_uav_turret_example/
They are intentionally source templates rather than universal pre-packed PBOs, because third-party addons have different base class names, nested MFD/Turrets hierarchies and user-channel allocations.
For each template:
README.txt;MY_* class/addon/path placeholders;rksla3_cvwp.RDY/INH comes from CVWP, not local physics.-showScriptErrors.