drawIcon3D: Difference between revisions

From Bohemia Interactive Community
(AGL)
No edit summary
 
(140 intermediate revisions by 14 users not shown)
Line 1: Line 1:
{{Command|= Comments
{{RV|type=command
____________________________________________________________________________________________


| arma3 |= Game name
|game1= arma3
|version1= 0.50


|0.50|= Game version
|gr1= Interaction
____________________________________________________________________________________________


| Draws an ingame icon at a given position. Command has to be executed each frame. Use [[onEachFrame]] or [[addMissionEventHandler]] "Draw3D" |= Description
|eff= local
____________________________________________________________________________________________


| '''drawIcon3D''' [texture, color, pos, width, height, angle, text, shadow, textSize, font, textAlign, drawSideArrows] |= Syntax
|descr= Draws an icon at the given position in the game world. This command has to be executed every frame. Use the [[Arma 3: Mission Event Handlers#Draw3D|Draw3D]] Mission Event Handler (which is executed every frame if the user can see the icon).<br>
In order for the results of this command to be visible through a [[camCreate|custom camera]], enable HUD with [[cameraEffectEnableHUD]].<br>
<sqf inline>showHUD false</sqf> will hide the icon drawn by this command.<br>
In order for arrows to appear, the icon texture should exist. The arrow size is proportionate to the icon size.


|p1= [texture, color, pos, width, height, angle, text, shadow, textSize, font, textAlign, drawSideArrows]: [[Array]]  |= PARAMETER1
{{Feature|informative|
* To avoid flickering and ensure visual fidelity, always use the [[Position#Formats|visual]] (render time scope) variant of position commands, such as [[getPosASLVisual]].
* The ''width'' and ''height'' parameters are multipliers for {{hl|activeWidth}} and {{hl|activeHeight}} set in config. So for example, if one needs to create an icon half the screen wide (<sqf inline>safeZoneW / 2</sqf>) and half the screen tall (<sqf inline>safeZoneH / 2</sqf>), divide these by the according config values: <sqf>
private _iconWidth = (safeZoneW / 2) / getNumber (configFile >> "CfgInGameUI" >> "Cursor" >> "activeWidth");
private _iconHeight = (safeZoneH / 2) / getNumber (configFile >> "CfgInGameUI" >> "Cursor" >> "activeHeight");
</sqf>
}}


|p2= texture: [[String]] |= PARAMETER2
|s1= [[drawIcon3D]] [texture, color, position, width, height, angle, text, shadow, textSize, font, textAlign, drawSideArrows, offsetX, offsetY]


|p3= color: [[Color]] |= PARAMETER3
|p1= texture: [[String]] - icon texture


|p4= pos: [[PositionAGL]] |= PARAMETER4
|p2= color:
* [[Array]] format [[Color|Color (RGBA)]] - icon color
* {{GVI|arma3|2.04|size= 0.75}} [[Array]] of two [[Array]]s format [[Color|Color (RGBA)]] - Icon and text color


|p5= width: [[Number]] |= PARAMETER5
|p3= position: [[Array]] format [[Position#PositionAGL|PositionAGL]] - icon position


|p6= height: [[Number]] |= PARAMETER6
|p4= width: [[Number]] - icon width


|p7= angle: [[Number]] |= PARAMETER7
|p5= height: [[Number]] - icon height


|p8= text: [[String]] - (optional)  |= PARAMETER8
|p6= angle: [[Number]] - icon rotation angle


|p9= shadow: [[Number]] - (optional) |= PARAMETER9
|p7= text: [[String]] - (Optional, default "") text label to display next to the icon


|p10= textSize: [[Number]] - (optional) |= PARAMETER10
|p8= shadow: (Optional, default 0)
* [[Number]]:
** '''0:''' no shadow
** '''1:''' shadow (not used in this context, used in UI context)
** '''2:''' outline
* [[Boolean]]:
** [[true]] - outline
** [[false]] - no shadow


|p11= font: [[String]] - (optional) |= PARAMETER11
|p9= textSize: [[Number]] - (Optional, default size of system) text size
|p12= textAlign: [[String]] - (optional)  |= PARAMETER12
|p13= drawSideArrows: [[Boolean]] - (optional)  |= PARAMETER13


| [[Nothing]] |= RETURNVALUE
|p10= font: [[String]] - (Optional, default "RobotoCondensedBold") font class name from {{hl|CfgFontFamilies}} (see {{Link|FXY File Format#Available Fonts}})


|p11= textAlign: [[String]] - (Optional, default "center") text alignment, can be one of:
* "left" - aligns the end of text line with the given position (text appears to the left of the position)
* "right" - aligns the beginning of text line with the given position (text appears to the right of the position)
* "center" - aligns the middle of text line with the given position (text appears central to the position)


|x1= Icon and text:<code>[[onEachFrame]] {
|p12= drawSideArrows: [[Boolean]] - (Optional, default [[false]]) [[true]] to draw arrows and the text label at edge of screen when the icon moves off the screen
[[drawIcon3D]] ["targetIcon.paa", [1,1,1,1], [[getPos]] [[cursorTarget]], 1, 1, 45, "Target", 1, 0.05, "TahomaB"];
};</code>|= EXAMPLE1


|p13= offsetX: [[Number]] - (Optional, default 0) X offset for the icon text
|p13since= arma3 2.04


|x2= Just text:
|p14= offsetY: [[Number]] - (Optional, default 0) Y offset for the icon text
<code>[[addMissionEventHandler]] ["Draw3D", {
|p14since= arma3 2.04
[[drawIcon3D]] ["", [1,0,0,1], [[position]] [[cursorTarget]], 0, 0, 0, "Target", 1, 0.05, "PuristaMedium"];
}];</code>|= EXAMPLE2
____________________________________________________________________________________________


| [[drawLine3D]] |= SEEALSO
|r1= [[Nothing]]


| |= MPBEHAVIOUR
|s2= [[drawIcon3D]] icon
____________________________________________________________________________________________
|s2since= arma3 2.22
}}


<h3 style='display:none'>Notes</h3>
|p21= icon: [[HashMap]] - hashmap structure in the following '''case-sensitive''', @-prefixed format:
<dl class='command_description'>
* @position: [[Array]] - the only mandatory parameter, can be one of the following formats:
<!-- Note Section BEGIN -->
** [x, y, (z:0)] - [[Position#Position2D|Position2D]] or [[Position#PositionAGL|PositionAGL]]
<dd class="notedate">Posted on August 31, 2013
** [object, offsetZ]
<dt class="note">'''[[User:Killzone_Kid|Killzone_Kid]]'''
*** object: [[Object]]
<dd class="note">As command syntax indicates, this command expects icon position in format [[Position]] meaning that over the land it expects [[PositionATL]] and over the sea [[PositionASL]]. Use additional [[ASLToATL]] and [[ATLToASL]] commands wherever is necessary. Alternatively use [[getPos]] or [[position]] commands, which will automatically adjust Z.
*** offsetZ: [[Number]] vertical offset
** [object, selection, offsetZ, lodIndex]
*** object: [[Object]]
*** selection: [[String]] - model selection, see [[animationNames]], [[selectionNames]]
*** offsetZ: [[Number]] - (Optional, default 0) vertical offset
*** lodIndex: [[Number]] - (Optional, default Memory LOD index, see [[allLODs]])
* @texture: [[String]] - (Optional, default "") icon image
* @size: [[Number]] - (Optional) texture sizeH, the sizeW is automatic, based on original texture dimensions (To find texture width use [[getTextureInfo]])
* @font: [[String]] - (Optional) global font name. Default current system font.
* @color: [[Color]] - (Optional, default White) icon color
* @arrowColor: [[Color]] - (Optional, default @color) arrow color
* @shadow: [[Boolean]] - (Optional, default [[false]]) [[true]] to outline, [[false]] no shadow
* @fade: [[Array]] - (Optional, default [-1, -1]) in format [distMin, distMax] start and end distance of icon fade
* @dynamic: [[Boolean]] - (Optional, default [[false]]) [[true]] to change icon size dynamically with percieved view distance [[false]] static size
* @drawArrows: [[Boolean]] - (Optional, default [[false]]) [[true]] to draw side out of view arrows and text for static icons only. Always [[false]] if @dynamic [[true]]
* @offsetX: [[Number]] - (Optional, default 0) x offset in screen units. > 0 offset right, < 0 offset left (always 0 if @drawArrows [[true]])
* @offsetY: [[Number]] - (Optional, default 0) y offset in screen units. > 0 offset down, < 0 offset up (always 0 if @drawArrows [[true]])
* @hardAlpha: [[Number]] - (Optional, default -1) 0..1 global alpha override for entire icon
* @checkVisibility: [[Boolean]] - (Optional, default [[false]]) [[true]] the icon will be obstructed by objects, smoke and vegetation
* @arrowText: [[Array]] - (Optional, default []) text to draw next to side arrows for static icons only in format [text, size, offsetXCoef, offsetYCoef, color, shadow]:
** text: [[String]] - text to show next to arrow
** size: [[Number]] - (Optional, default current system font size) text height in screen units (To find text width use [[getTextWidth]])
** offsetXCoef: [[Number]] - (Optional, default 1) X-spacing coefficient between arrows and text
** offsetYCoef: [[Number]] - (Optional, default 1) Y-spacing coefficient between arrows and text
** color: [[Color]] (Optional, default White) text color
** shadow: [[Boolean]] (Optional, default [[false]]) [[true]] to outline, [[false]] no shadow
* @texts: [[Array]] of [[Array]]s - (Optional, default []) multiple visible texts in format <nowiki>[</nowiki>[text, size, offsetX, offsetY, color, shadow], ...]:
** text: [[String]] - text to show
** size: [[Number]] - (Optional, default current system font size) text height in screen units (To find text width use [[getTextWidth]])
** offsetX: [[Number]] - (Optional, default 0) x offset in screen units. > 0 offset right, < 0 offset left
** offsetY: [[Number]] - (Optional, default 0) y offset in screen units. > 0 offset down, < 0 offset up
** color: [[Color]] (Optional, default White) text color
** shadow: [[Boolean]] (Optional, default [[false]]) [[true]] to outline, [[false]] no shadow
* @progress: [[Array]] - (Optional, default []) progress bar in format [width, height, offsetX, offsetY, colorFG, colorBG]:
** width: [[Number]] - width of the progress bar in screen units (width < height - vertical bar)
** height: [[Number]] - height of the progress bar in screen units (height <= width - horizontal bar)
** offsetX: [[Number]] - (Optional, default 0) x offset
** offsetY: [[Number]] - (Optional, default 0) y offset
** colorFG: [[Color]] - (Optional, default White) forground color
** colorBG: [[Color]] - (Optional, default Grey) background color
* @progressValue: [[Number]] - (Optional, default -1) progress bar progress in 0...1 range. -1 - progress bar is not drawn


To draw smooth moving icon for a moving object use [[visiblePosition]] and [[visiblePositionASL]] accordingly.
|r2= [[Nothing]]


<dd class="notedate">Posted on September 23, 2013
|x1= Icon and text:
<dt class="note">'''[[User:Killzone_Kid|Killzone_Kid]]'''
<sqf>
<dd class="note">This command works well with addon textures, however getting it to display mission textures is a bit tricky. Follow [http://killzonekid.com/arma-scripting-tutorials-mission-root/ this guide]:
addMissionEventHandler ["Draw3D", {
drawIcon3D ["targetIcon.paa", [1, 1, 1, 1], ASLToAGL getPosASLVisual cursorTarget, 1, 1, 45, "Target", 1, 0.05, "TahomaB"];
}];
</sqf>
 
|x2= Just text:
<sqf>
addMissionEventHandler ["Draw3D", {
drawIcon3D ["", [1, 0, 0, 1], ASLToAGL getPosASLVisual cursorTarget, 0, 0, 0, "Target", 1, 0.05, "PuristaMedium"];
}];
</sqf>


|x3= <sqf>
iconPos = player getPos [10, 0] vectorAdd [0,0,2];
addMissionEventHandler ["draw3D",
{
drawIcon3D
[
"\a3\ui_f\data\IGUI\Cfg\Radar\radar_ca.paa",
[0, 0, 1, 1],
iconPos,
5,
5,
getDirVisual player,
"COMPASS",
0,
0.3,
"PuristaMedium",
"center",
true
];
}];
</sqf>


<dd class="notedate">Posted on April 19, 2014
|x4= Since {{GVI|arma3|2.04}}
<dt class="note">'''[[User:AgentRevolution|AgentRev]]'''
<sqf>
<dd class="note">Just a little precision to KK's first comment, this command expects '''[[PositionASLW]]''' over the sea, not regular ASL. Luckily, [[modelToWorld]] returns ATL over land and ASLW over sea, so if you want the icon to stay the the same place, you should use this snippet to find the correct position:
pos = player getPos [10, 0] vectorAdd [0,0,2];
<br/>
addMissionEventHandler ["draw3D",
<br/>
{
<code>_pos = visiblePositionASL _object;
_k = 10 / (player distance pos);
_pos set [2, (_object modelToWorld [0,0,0]) select 2];</code>
drawIcon3D
[
"\a3\ui_f\data\IGUI\Cfg\Radar\radar_ca.paa",
[1, 0, 0, 1],
pos,
1 * _k,
1 * _k,
0,
name player,
0,
0.04 * _k,
"RobotoCondensed",
"right",
true,
0.005 * _k,
-0.035 * _k
];
}];
</sqf>


|x5= Since {{GVI|arma3|2.22}}
<sqf>
removeAllMissionEventHandlers "Draw3D";
deleteVehicle flagA;
flagA = createVehicle ["Flag_AAF_F", position player, [], 0, "NONE"];
icon = createHashMapFromArray
[
["@position", [flagA, 5]],
["@texture", "\A3\Data_F\Flags\Flag_AAF_CO.paa"],
["@texts", [["Sector Alpha", 0.025, 0, 0.05, [1,1,0,1]]]],
["@size", 0.05],
["@drawArrows", true],
["@arrowText", ["A", 0.1, 0.3, 0.3, [1,1,0,1]]],
["@fade", [10, 100]],
["@arrowColor", [0,1,0,1]],
["@progress", [0.005, 0.05, -0.01, 0, [0.8,0.8,0,1], [0,0.6,0,0.6]]],
["@progressValue", 0.67]
];
addMissionEventHandler ["Draw3D", {drawIcon3D icon}];
</sqf>


<!-- Note Section END -->
|seealso= [[drawLine3D]] [[getMissionPath]] [[showHUD]] [[cameraEffectEnableHUD]]
</dl>
}}


<h3 style='display:none'>Bottom Section</h3>
{{Note
[[Category:Arma_3:_New_Scripting_Commands_List|{{uc:{{PAGENAME}}}}]]
|user= Killzone_Kid
[[Category:Scripting Commands Arma 3|{{uc:{{PAGENAME}}}}]]
|timestamp= 20130831095100
[[Category:Scripting Commands|{{uc:{{PAGENAME}}}}]]
|text= As command syntax indicates, this command expects icon position in format [[Position#PositionAGL|PositionAGL]] meaning that over the land it expects [[Position#PositionATL|PositionATL]] and over the sea [[Position#PositionASLW|PositionASLW]].<br>
This command works well with addon textures, however getting it to display mission textures is a bit tricky. Follow {{Link|http://killzonekid.com/arma-scripting-tutorials-mission-root/|this guide}}.
}}


<!-- CONTINUE Notes -->
{{Note
<dl class="command_description">
|user= AgentRev
<dd class="notedate">Posted on October 23, 2014 - 02:42 (UTC)</dd>
|timestamp= 20140419223500
<dt class="note">[[User:DreadedEntity|DreadedEntity]]</dt>
|text= You should rely exclusively on [[modelToWorldVisual]] for a moving object's icon position if you want it to accurately stay at the correct height over the sea. It computes faster than [[ASLToAGL]].<br>
<dd class="note">
Width, height, and textSize are proportional to the user's interface size, which can optionally be compensated against via {{hl|size / ([[getResolution]] select 5)}}<br>
[[drawIcon3D]] and [[BIS_fnc_addStackedEventHandler]] work well together.<br><br>
Additionally, width and height are inversely proportional to the {{hl|fovLeft}} and {{hl|fovTop}} parameters from the user's [[Profile|ArmaProfile]], and AFAIK those parameters are not retrievable via scripting.
For example, a {{hl|fovTop}} higher than the default value of 0.75 will make all 3D icons smaller vertically. I'm not sure if this is a bug or by design, however it is definitely annoying to take into account.
}}


{{Note
|user= DreadedEntity
|timestamp= 20141023024200
|text= <spoiler>[[drawIcon3D]] and [[BIS_fnc_addStackedEventHandler]] work well together.<br>
Using formatting commands with [[drawIcon3D]] will not work, instead, they will be added to the string.<br>
Using formatting commands with [[drawIcon3D]] will not work, instead, they will be added to the string.<br>
<code>["uniqueID", "onEachFrame",  
<sqf>
["uniqueID", "onEachFrame",
{
{
drawIcon3D["myIcon.jpg", [1,1,1,0.5], getPos player, 1, 1, 0, format["%1\n%2", "Dreaded", "Entity"]];
drawIcon3D ["myIcon.jpg", [1,1,1,0.5], getPos player, 1, 1, 0, format ["%1\n%2", "Dreaded", "Entity"]];
}] call BIS_fnc_addStackedEventHandler;</code>
}] call BIS_fnc_addStackedEventHandler;
</sqf>
Shown text will be '''Dreaded\nEntity'''. '''(A3 1.32.127785)'''<br><br>
Shown text will be '''Dreaded\nEntity'''. '''(A3 1.32.127785)'''<br><br>


The "text" parameter must be a string. You cannot use [[Structured_Text]].<br>
The "text" parameter must be a string. You cannot use [[Structured_Text]].<br>
<code>["uniqueID", "onEachFrame",  
<sqf>
["uniqueID", "onEachFrame",
{
{
drawIcon3D
drawIcon3D
Line 112: Line 246:
1,
1,
0,
0,
parseText format["<t size='1.25' font='PuristaLight' color='#ff0000'>%1%2</t>", Dreaded, Entity]
parseText format ["<t size='1.25' font='PuristaLight' color='#ff0000'>%1%2</t>", Dreaded, Entity]
];
];
}] call BIS_fnc_addStackedEventHandler;</code>
}] call BIS_fnc_addStackedEventHandler;
'''(A3 1.32.127785)'''
</sqf>
</dd>
'''(A3 1.32.127785)'''</spoiler>
</dl>
{{Feature|obsolete}}
}}


<dl class="command_description">
<dd class="notedate">Posted on November 13 (2014)</dd>
<dt class="note">[[User:Iceman77|Iceman77]]</dt>
<dd class="note">
Here's a practical example combining both drawLine3D and drawIcon3D. Note: You may want to use visiblePosition instead of getPos for moving objects. 
<code>DEADPILOTS = [];
{
    if (getText (configfile >> "CfgVehicles" >> typeOf _x >> "textSingular") == "pilot") then {
DEADPILOTS pushBack _x;
    };
} forEach allDeadMen;


addMissionEventHandler ["Draw3D", {
{{Note
    if (
|user= PierreMGI
|timestamp= 20160322203800
|text= If you want to use this command, on each frame, with plenty of objects or entities to mark, you can manage conditions in order to reduce the number of CPU operations.
One of the most demanding CPU resource is probably a DrawIcon3D treatment for these objects/entities because even if not displayed (like for objects behind player), the CPU calculates the icons in the defined radius of your nearEntities / nearestObjects command.
Don't stay with a simple radius condition (disk selecting entities or nearestObjects) which calculates all, then useless (not displayed), icons!
 
Here is a way to restrict this command to your screen display:
in a onEachFramed context:
<sqf>
unitsToDisplay = allUnits;
addMissionEventHandler ["EachFrame", {
private _offset = [0,0,0];
{
{
    player distance _x <= 15
private _screenPosition = worldToScreen (_x modelToWorldVisual _offset);
} count DEADPILOTS > 0
if (_screenPosition isEqualTo []) then { continue };
      ) then {
// < your drawIcon3D treatment here >
        {
} foreach unitsToDisplay
    _corpsePos = getPos _x;
    if (player distance _corpsePos <= 15) then {
_line1_start = _corpsePos;
_line1_end = [(_line1_start select 0), (_line1_start select 1), 0.5];
_line2_start = [(_line1_end select 0), (_line1_end select 1) + 0.5, (_line1_end select 2)];
drawLine3D [_line1_start, _line1_end, [0,0,0,0.5]];
drawLine3D [_line1_end, _line2_start, [0,0,0,0.5]];
drawIcon3D ["\a3\ui_f\data\gui\cfg\hints\BasicLook_ca.paa", [0,0,0,0.5], _line2_start, 0.75, 0.75, 0];
    };
} forEach DEADPILOTS;
    };
}];
}];
</code>
</sqf>
</dd>
Tested with +100 units, equally spread on a disk. (Note: FPS depend also on environment in map. Choose a "desert" for that).
</dl>
}}
<!-- DISCONTINUE Notes -->
 
<!-- CONTINUE Notes -->
<dl class="command_description">
<dd class="notedate">Posted on April 11, 2015 - 07:36 (UTC)</dd>
<dt class="note">[[User:Killzone Kid|Killzone Kid]]</dt>
<dd class="note">
Doesn't work when [[showHUD]] false, textAlign is broken, drawSideArrows will turn if angle is not 0 [http://feedback.arma3.com/view.php?id=23700]
</dd>
</dl>
<!-- DISCONTINUE Notes -->

Latest revision as of 13:25, 1 November 2025

Hover & click on the images for description

Description

Description:
Draws an icon at the given position in the game world. This command has to be executed every frame. Use the Draw3D Mission Event Handler (which is executed every frame if the user can see the icon).
In order for the results of this command to be visible through a custom camera, enable HUD with cameraEffectEnableHUD.
showHUD false will hide the icon drawn by this command.
In order for arrows to appear, the icon texture should exist. The arrow size is proportionate to the icon size.
Groups:
Interaction

Syntax

Syntax:
drawIcon3D [texture, color, position, width, height, angle, text, shadow, textSize, font, textAlign, drawSideArrows, offsetX, offsetY]
Parameters:
texture: String - icon texture
color:
position: Array format PositionAGL - icon position
width: Number - icon width
height: Number - icon height
angle: Number - icon rotation angle
text: String - (Optional, default "") text label to display next to the icon
shadow: (Optional, default 0)
  • Number:
    • 0: no shadow
    • 1: shadow (not used in this context, used in UI context)
    • 2: outline
  • Boolean:
textSize: Number - (Optional, default size of system) text size
font: String - (Optional, default "RobotoCondensedBold") font class name from CfgFontFamilies (see FXY File Format - Available Fonts)
textAlign: String - (Optional, default "center") text alignment, can be one of:
  • "left" - aligns the end of text line with the given position (text appears to the left of the position)
  • "right" - aligns the beginning of text line with the given position (text appears to the right of the position)
  • "center" - aligns the middle of text line with the given position (text appears central to the position)
drawSideArrows: Boolean - (Optional, default false) true to draw arrows and the text label at edge of screen when the icon moves off the screen
since Arma 3 logo black.png 2.04
offsetX: Number - (Optional, default 0) X offset for the icon text
since Arma 3 logo black.png 2.04
offsetY: Number - (Optional, default 0) Y offset for the icon text
Return Value:
Nothing

Alternative Syntax

Syntax:
drawIcon3D icon
Parameters:
icon: HashMap - hashmap structure in the following case-sensitive, @-prefixed format:
  • @position: Array - the only mandatory parameter, can be one of the following formats:
  • @texture: String - (Optional, default "") icon image
  • @size: Number - (Optional) texture sizeH, the sizeW is automatic, based on original texture dimensions (To find texture width use getTextureInfo)
  • @font: String - (Optional) global font name. Default current system font.
  • @color: Color - (Optional, default White) icon color
  • @arrowColor: Color - (Optional, default @color) arrow color
  • @shadow: Boolean - (Optional, default false) true to outline, false no shadow
  • @fade: Array - (Optional, default [-1, -1]) in format [distMin, distMax] start and end distance of icon fade
  • @dynamic: Boolean - (Optional, default false) true to change icon size dynamically with percieved view distance false static size
  • @drawArrows: Boolean - (Optional, default false) true to draw side out of view arrows and text for static icons only. Always false if @dynamic true
  • @offsetX: Number - (Optional, default 0) x offset in screen units. > 0 offset right, < 0 offset left (always 0 if @drawArrows true)
  • @offsetY: Number - (Optional, default 0) y offset in screen units. > 0 offset down, < 0 offset up (always 0 if @drawArrows true)
  • @hardAlpha: Number - (Optional, default -1) 0..1 global alpha override for entire icon
  • @checkVisibility: Boolean - (Optional, default false) true the icon will be obstructed by objects, smoke and vegetation
  • @arrowText: Array - (Optional, default []) text to draw next to side arrows for static icons only in format [text, size, offsetXCoef, offsetYCoef, color, shadow]:
    • text: String - text to show next to arrow
    • size: Number - (Optional, default current system font size) text height in screen units (To find text width use getTextWidth)
    • offsetXCoef: Number - (Optional, default 1) X-spacing coefficient between arrows and text
    • offsetYCoef: Number - (Optional, default 1) Y-spacing coefficient between arrows and text
    • color: Color (Optional, default White) text color
    • shadow: Boolean (Optional, default false) true to outline, false no shadow
  • @texts: Array of Arrays - (Optional, default []) multiple visible texts in format [[text, size, offsetX, offsetY, color, shadow], ...]:
    • text: String - text to show
    • size: Number - (Optional, default current system font size) text height in screen units (To find text width use getTextWidth)
    • offsetX: Number - (Optional, default 0) x offset in screen units. > 0 offset right, < 0 offset left
    • offsetY: Number - (Optional, default 0) y offset in screen units. > 0 offset down, < 0 offset up
    • color: Color (Optional, default White) text color
    • shadow: Boolean (Optional, default false) true to outline, false no shadow
  • @progress: Array - (Optional, default []) progress bar in format [width, height, offsetX, offsetY, colorFG, colorBG]:
    • width: Number - width of the progress bar in screen units (width < height - vertical bar)
    • height: Number - height of the progress bar in screen units (height <= width - horizontal bar)
    • offsetX: Number - (Optional, default 0) x offset
    • offsetY: Number - (Optional, default 0) y offset
    • colorFG: Color - (Optional, default White) forground color
    • colorBG: Color - (Optional, default Grey) background color
  • @progressValue: Number - (Optional, default -1) progress bar progress in 0...1 range. -1 - progress bar is not drawn
Return Value:
Nothing

Examples

Example 1:
Icon and text:
addMissionEventHandler ["Draw3D", { drawIcon3D ["targetIcon.paa", [1, 1, 1, 1], ASLToAGL getPosASLVisual cursorTarget, 1, 1, 45, "Target", 1, 0.05, "TahomaB"]; }];
Example 2:
Just text:
addMissionEventHandler ["Draw3D", { drawIcon3D ["", [1, 0, 0, 1], ASLToAGL getPosASLVisual cursorTarget, 0, 0, 0, "Target", 1, 0.05, "PuristaMedium"]; }];
Example 3:
iconPos = player getPos [10, 0] vectorAdd [0,0,2]; addMissionEventHandler ["draw3D", { drawIcon3D [ "\a3\ui_f\data\IGUI\Cfg\Radar\radar_ca.paa", [0, 0, 1, 1], iconPos, 5, 5, getDirVisual player, "COMPASS", 0, 0.3, "PuristaMedium", "center", true ]; }];
Example 4:
Since Arma 3 logo black.png 2.04
pos = player getPos [10, 0] vectorAdd [0,0,2]; addMissionEventHandler ["draw3D", { _k = 10 / (player distance pos); drawIcon3D [ "\a3\ui_f\data\IGUI\Cfg\Radar\radar_ca.paa", [1, 0, 0, 1], pos, 1 * _k, 1 * _k, 0, name player, 0, 0.04 * _k, "RobotoCondensed", "right", true, 0.005 * _k, -0.035 * _k ]; }];
Example 5:
Since Arma 3 logo black.png 2.22
removeAllMissionEventHandlers "Draw3D"; deleteVehicle flagA; flagA = createVehicle ["Flag_AAF_F", position player, [], 0, "NONE"]; icon = createHashMapFromArray [ ["@position", [flagA, 5]], ["@texture", "\A3\Data_F\Flags\Flag_AAF_CO.paa"], ["@texts", [["Sector Alpha", 0.025, 0, 0.05, [1,1,0,1]]]], ["@size", 0.05], ["@drawArrows", true], ["@arrowText", ["A", 0.1, 0.3, 0.3, [1,1,0,1]]], ["@fade", [10, 100]], ["@arrowColor", [0,1,0,1]], ["@progress", [0.005, 0.05, -0.01, 0, [0.8,0.8,0,1], [0,0.6,0,0.6]]], ["@progressValue", 0.67] ]; addMissionEventHandler ["Draw3D", {drawIcon3D icon}];

Additional Information

See also:
drawLine3D getMissionPath showHUD cameraEffectEnableHUD

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note
Killzone_Kid - c
Posted on Aug 31, 2013 - 09:51 (UTC)
As command syntax indicates, this command expects icon position in format PositionAGL meaning that over the land it expects PositionATL and over the sea PositionASLW.
This command works well with addon textures, however getting it to display mission textures is a bit tricky. Follow this guide.
AgentRev - c
Posted on Apr 19, 2014 - 22:35 (UTC)
You should rely exclusively on modelToWorldVisual for a moving object's icon position if you want it to accurately stay at the correct height over the sea. It computes faster than ASLToAGL.
Width, height, and textSize are proportional to the user's interface size, which can optionally be compensated against via size / (getResolution select 5)
Additionally, width and height are inversely proportional to the fovLeft and fovTop parameters from the user's ArmaProfile, and AFAIK those parameters are not retrievable via scripting. For example, a fovTop higher than the default value of 0.75 will make all 3D icons smaller vertically. I'm not sure if this is a bug or by design, however it is definitely annoying to take into account.
DreadedEntity - c
Posted on Oct 23, 2014 - 02:42 (UTC)

drawIcon3D and BIS_fnc_addStackedEventHandler work well together.
Using formatting commands with drawIcon3D will not work, instead, they will be added to the string.

["uniqueID", "onEachFrame", { drawIcon3D ["myIcon.jpg", [1,1,1,0.5], getPos player, 1, 1, 0, format ["%1\n%2", "Dreaded", "Entity"]]; }] call BIS_fnc_addStackedEventHandler;

Shown text will be Dreaded\nEntity. (A3 1.32.127785)

The "text" parameter must be a string. You cannot use Structured_Text.

["uniqueID", "onEachFrame", { drawIcon3D [ "myIcon.jpg", [1,1,1,0.5], getPos player, 1, 1, 0, parseText format ["<t size='1.25' font='PuristaLight' color='#ff0000'>%1%2</t>", Dreaded, Entity] ]; }] call BIS_fnc_addStackedEventHandler;

(A3 1.32.127785)

🕖
This information is obsolete.


PierreMGI - c
Posted on Mar 22, 2016 - 20:38 (UTC)
If you want to use this command, on each frame, with plenty of objects or entities to mark, you can manage conditions in order to reduce the number of CPU operations. One of the most demanding CPU resource is probably a DrawIcon3D treatment for these objects/entities because even if not displayed (like for objects behind player), the CPU calculates the icons in the defined radius of your nearEntities / nearestObjects command. Don't stay with a simple radius condition (disk selecting entities or nearestObjects) which calculates all, then useless (not displayed), icons! Here is a way to restrict this command to your screen display: in a onEachFramed context:
unitsToDisplay = allUnits; addMissionEventHandler ["EachFrame", { private _offset = [0,0,0]; { private _screenPosition = worldToScreen (_x modelToWorldVisual _offset); if (_screenPosition isEqualTo []) then { continue }; // < your drawIcon3D treatment here > } foreach unitsToDisplay }];
Tested with +100 units, equally spread on a disk. (Note: FPS depend also on environment in map. Choose a "desert" for that).