Skip to content

Instantly share code, notes, and snippets.

@dedmen
Created April 14, 2018 18:16
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dedmen/e0ddee95a69608ceedb1650eb0f2a0d0 to your computer and use it in GitHub Desktop.
Save dedmen/e0ddee95a69608ceedb1650eb0f2a0d0 to your computer and use it in GitHub Desktop.
[] spawn {
/*
Author: Karel Moricky
Description:
Export list of objects for Community Wiki
https://community.bistudio.com/wiki/Category:Arma_3:_Assets
Parameter(s):
0: NUMBER - duration in seconds for which an objects remains on the screen before its screen is captured (default: 1 s)
1: STRING:
"vehicles" - only characters and vehicles will be used
"props" - only props will be used
"all" (default) - all objects will be used
2: ARRAY of SIDEs - list of sides. Only objects of these sides will be used (default: all sides)
3: ARRAY of STRINGs - list of CfgMods classes. Only objects belonging to these mods will be used (default: all mods)
4: ARRAY of STRINGs - list of CfgPatches classes. Only objects belonging to these addons will be used (default: all addons)
5: ARRAY of STRINGs - list of CfgVehicles classes. Only these objects will be used (default: all classes)
Returns:
Nothing
*/
//#define DEBUG
disableserialization;
_delay = 5;
_product = productversion select 1;
//--- Convert sides to numbers
#ifdef MACROS
private ["_path","_br","_result","_resultText"];
startloadingscreen [""];
_path = configfile >> "cfgvehicles";//_this param [0,configfile >> "cfgvehicles",[configfile]];
_br = tostring [13,10];
_result = [];
//--- Pre-expansion DLC content is all in the default addon
_dlcTable = [
["curator", ""],
["kart", ""],
["heli", ""],
["mark", ""],
["tacops", ""],
["jets", "Jets"],
["expansion", "Exp"],
["expansionpremium", "Exp"]
];
{
_dlc = _x call _fnc_getDlc;
if (_dlc != "") then {_dlc = "_" + _dlc;};
_result = _result + [format ["#define CFGVEHICLES_EDITORPREVIEW_%1 editorPreview = ""\A3\EditorPreviews_F%2\Data\CfgVehicles\%1.jpg"";",configname _x,_dlc]];
} foreach _cfgVehicles;
_result = _result call BIS_fnc_sortAlphabetically;
_resultText = "";
{_resultText = _resultText + _x + _br;} foreach _result;
copytoclipboard _resultText;
endloadingscreen;
if (true) exitwith {};
#endif
//--- Export pictures ------------------------------------
//--- Prepare the scene
_posZ = 250;
_pos = [1024,1024,_posZ];
_cam = "camera" camcreate _pos;
_cam cameraeffect ["internal","back"];
_cam campreparefocus [-1,-1];
_cam campreparefov 0.4;
_cam camcommitprepared 0;
showcinemaborder false;
_sphereColor = "#(argb,8,8,3)color(0.93,1.0,0.98,0.1)"; //--- VR ground
//_sphereColor = "#(argb,8,8,3)color(0.93,1.0,0.98,0.028)"; //--- VR sky
//_sphereColor = "#(argb,8,8,3)color(1,1,1,1)"; //--- White
_sphereGround = createvehicle ["Sphere_3DEN",_pos,[],0,"none"];
_sphereNoGround = createvehicle ["SphereNoGround_3DEN",_pos,[],0,"none"];
{
_x setposatl _pos;
_x setdir 0;
_x setobjecttexture [0,_sphereColor];
_x setobjecttexture [1,_sphereColor];
_x hideobject true;
} foreach [_sphereGround,_sphereNoGround];
setaperture 45;//35;
setdate [2035,5,28,10,0];
//--- Is preview capturing in Eden?
_display = [] call bis_fnc_displayMission;
if (is3DEN) then {
_display = finddisplay 313;
["showinterface",false] call bis_fnc_3DENInterface;
};
//--- Prepare the UI
_ctrlInfoW = 0.5;
_ctrlInfoH = 0.2;
_ctrlInfo = _display ctrlcreate ["RscStructuredText",-1];
_ctrlInfo ctrlsetposition [
safezoneX + 0.1,//safezoneX + safezoneW - _ctrlInfoW - 0.1,
safezoneY + safezoneH - _ctrlInfoH,
safezoneW - 0.2,//_ctrlInfoW,
_ctrlInfoH
];
//_ctrlInfo ctrlsetbackgroundcolor [0,0,0,1];
//_ctrlInfo ctrlsetfontheight (_ctrlInfoH * 0.7);
_ctrlInfo ctrlcommit 0;
_ctrlProgressH = 0.01;
_ctrlProgress = _display ctrlcreate ["RscProgress",-1];
_ctrlProgress ctrlsetposition [
safezoneX,
safezoneY + safezoneH - _ctrlProgressH,
safezoneW,
_ctrlProgressH
];
_ctrlProgress ctrlcommit 0;
_screenTop = safezoneY;
_screenBottom = safezoneY + safezoneH;
_screenLeft = safezoneX;
_screenRight = safezoneX + safezoneW;
#ifdef DEBUG
_helpers = [
createvehicle ["Sign_Sphere10cm_F",[1,1,1],[],0,"none"],
createvehicle ["Sign_Sphere10cm_F",[1,1,1],[],0,"none"],
createvehicle ["Sign_Sphere10cm_F",[1,1,1],[],0,"none"],
createvehicle ["Sign_Sphere10cm_F",[1,1,1],[],0,"none"],
createvehicle ["Sign_Sphere10cm_F",[1,1,1],[],0,"none"],
createvehicle ["Sign_Sphere10cm_F",[1,1,1],[],0,"none"],
createvehicle ["Sign_Sphere10cm_F",[1,1,1],[],0,"none"],
createvehicle ["Sign_Sphere10cm_F",[1,1,1],[],0,"none"]
];
{
(_helpers select _foreachindex) setobjecttexture [0,_x];
} foreach [
"#(argb,8,8,3)color(1,1,1,1)",
"#(argb,8,8,3)color(0,0,1,1)",
"#(argb,8,8,3)color(0,1,0,1)",
"#(argb,8,8,3)color(0,1,1,1)",
"#(argb,8,8,3)color(1,0,0,1)",
"#(argb,8,8,3)color(1,0,1,1)",
"#(argb,8,8,3)color(1,1,0,1)",
"#(argb,8,8,3)color(1,1,1,1)"
];
#endif
//--- Main loop -------------------------------------------
{
_x params ["_class","_path"];
//--- Get filename
_fileName = format ["EditorPreviews\%2.png",_class];
//--- Update UI
_ctrlInfo ctrlsetstructuredtext parsetext format ["Saving screenshot to<br /><t font='EtelkaMonospaceProBold' size='0.875'>[Arma 3 Profile]\Screenshots\%1</t><br />Note: The text overlay will not be saved.",_fileName];
//--- Set position and camera angles (exsception for helipads)
_camDirH = 135;
_camDirV = 15;
_posLocal = +_pos;
//--- Create object
_object = createSimpleObject [_path,_posLocal];
if (primaryweapon _object != "") then {_object switchmove "amovpercmstpslowwrfldnon"} else {_object switchmove "amovpercmstpsnonwnondnon";};
_object setposatl _posLocal;
_object switchaction "default";
_timeCapture = time + _delay;
if (_object iskindof "FlagCarrierCore") then {
_object spawn {_this enablesimulation false;}; // Delay freezing to initialize flag
} else {
_object enablesimulation false;
};
//--- Caulculate bounding box corners
_bbox = boundingboxreal _object;
_bbox1 = _bbox select 0;
_bbox2 = _bbox select 1;
_worldPositions = [
_object modeltoworld [_bbox1 select 0,_bbox1 select 1,_bbox1 select 2],
_object modeltoworld [_bbox1 select 0,_bbox1 select 1,_bbox2 select 2],
_object modeltoworld [_bbox1 select 0,_bbox2 select 1,_bbox1 select 2],
_object modeltoworld [_bbox1 select 0,_bbox2 select 1,_bbox2 select 2],
_object modeltoworld [_bbox2 select 0,_bbox1 select 1,_bbox1 select 2],
_object modeltoworld [_bbox2 select 0,_bbox1 select 1,_bbox2 select 2],
_object modeltoworld [_bbox2 select 0,_bbox2 select 1,_bbox1 select 2],
_object modeltoworld [_bbox2 select 0,_bbox2 select 1,_bbox2 select 2]
];
#ifdef DEBUG
{
_x setpos (_worldPositions select _foreachindex);
} foreach _helpers;
#endif
//--- Set background sphere
_pointLowest = 0;
_pointHighest = 0;
{
_xZ = (_x select 2) - _posZ;
if (_xZ > _pointHighest) then {_pointHighest = _xZ;};
if (_xZ < _pointLowest) then {_pointLowest = _xZ;};
} foreach _worldPositions;
_sphere = if (abs(_pointLowest) > abs(_pointHighest * 2/3)) then {_sphereNoGround} else {_sphereGround};
_sphere hideobject false;
_sphere setpos _pos;
//--- Set camera
_camAngle = _camDirV;
_camDis = (1.5 * ((sizeof _class) max 0.1)) min 124 max 0.2; //--- 125 m is a sphere diameter
_camPos = [_posLocal,_camDis,_camDirH] call bis_fnc_relpos;
_camPos set [2,/*_posZ*/((_object modeltoworld [0,0,0]) select 2) + (tan _camAngle * _camDis)];
_cam campreparepos _camPos;
_cam campreparetarget (_object modeltoworld [0,0,0]);
_cam campreparefocus [-1,-1];
_cam campreparefov 0.7;
_cam camcommitprepared 0;
sleep 0.01; //--- Delay for camera to load
//--- Calculate target
_extremes = [0.5,0.5,0.5,0.5]; //--- Left, Right, Top, Bottom
{
_screenPos = worldtoscreen _x;
if (count _screenPos > 0) then {
_screenPosX = _screenPos select 0;
_screenPosY = _screenPos select 1;
if (_screenPosX < (_extremes select 0)) then {_extremes set [0,_screenPosX];};
if (_screenPosX > (_extremes select 1)) then {_extremes set [1,_screenPosX];};
if (_screenPosY > (_extremes select 3)) then {_extremes set [3,_screenPosY];};
if (_screenPosY < (_extremes select 2)) then {_extremes set [2,_screenPosY];};
};
} foreach _worldPositions;
_cam campreparetarget screentoworld [
(_extremes select 0) + ((_extremes select 1) - (_extremes select 0)) / 2,
(_extremes select 2) + ((_extremes select 3) - (_extremes select 2)) / 2
];
//--- Calculate zoom - get the closest zoom where all bounding box corners are still visible
_fovStart = if (_camDis < 0.35) then {0.4} else {0.1}; //--- When camera is too close, it cuts into the model itself
for "_f" from _fovStart to 0.7 step 0.01 do {
_cam campreparefov _f;
_cam camcommitprepared 0;
sleep 0.01; //--- Delay for camera to load
_onScreen = true;
{
_screenPos = worldtoscreen _x;
if (count _screenPos == 0) then {_screenPos = [10,10];};
if (abs (linearconversion [_screenLeft,_screenRight,_screenPos select 0,-1,1]) > 1) exitwith {_onScreen = false;};
if (abs (linearconversion [_screenTop,_screenBottom,_screenPos select 1,-1,1]) > 1) exitwith {_onScreen = false;};
} foreach _worldPositions;
if (_onScreen) exitwith {};
};
//--- Wait for model to load and take a screenshot
waituntil {time > _timeCapture};
screenshot _fileName;
sleep 0.01;
//--- Delete the object
_object setpos [10,10,10];
deletevehicle _object;
_sphere hideobject true;
} foreach [
["silencer","\RH_acc\RH_fa762"]
];
//--- Reset the scene
_cam cameraeffect ["terminate","back"];
camdestroy _cam;
deletevehicle _sphereGround;
deletevehicle _sphereNoGround;
setaperture -1;
ctrldelete _ctrlInfo;
ctrldelete _ctrlProgress;
if (is3DEN) then {
get3dencamera cameraeffect ["internal","back"];
["showinterface",true] call bis_fnc_3DENInterface;
};
#ifdef DEBUG
{deletevehicle _x;} foreach _helpers;
#endif
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment