R3F_Logistics/R3F_LOG/fonctions_generales/lib_visualisation_objet.sqf
2018-02-18 22:40:31 -07:00

108 lines
3.5 KiB
Plaintext

/**
* Bibliothèque de fonctions permettant la visualisation 3D d'objets
*
* Copyright (C) 2014 Team ~R3F~
*
* This program is free software under the terms of the GNU General Public License version 3.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* Démarre le mode de visualisation 3D
*/
R3F_LOG_VIS_FNCT_demarrer_visualisation =
{
// Création d'une caméra
R3F_LOG_VIS_cam = "camera" camCreate ([[5000, 5000, 0]] call R3F_LOG_FNCT_3D_tirer_position_degagee_ciel);
R3F_LOG_VIS_cam cameraEffect ["Internal", "BACK"];
R3F_LOG_VIS_cam camSetFocus [-1, -1];
showCinemaBorder false;
R3F_LOG_VIS_cam camCommit 0;
camUseNVG (sunOrMoon == 0);
R3F_LOG_VIS_objet = objNull;
// Fil d'exécution réalisant une rotation continue de la caméra autour de l'objet à visualiser
0 spawn
{
// Tant qu'on ne quitte pas la visualisation
while {!isNull R3F_LOG_VIS_cam} do
{
private ["_objet", "_distance_cam", "_azimut_cam"];
// Attente d'un objet à visualiser
waitUntil {!isNull R3F_LOG_VIS_objet};
_objet = R3F_LOG_VIS_objet;
_distance_cam = 2.25 * (
[boundingBoxReal _objet select 0 select 0, boundingBoxReal _objet select 0 select 2]
distance
[boundingBoxReal _objet select 1 select 0, boundingBoxReal _objet select 1 select 2]
);
_azimut_cam = 0;
R3F_LOG_VIS_cam camSetTarget _objet;
R3F_LOG_VIS_cam camSetPos (_objet modelToWorld [_distance_cam * sin _azimut_cam, _distance_cam * cos _azimut_cam, _distance_cam * 0.33]);
R3F_LOG_VIS_cam camCommit 0;
// Rotation autour de l'objet
while {R3F_LOG_VIS_objet == _objet} do
{
_azimut_cam = _azimut_cam + 3.25;
R3F_LOG_VIS_cam camSetPos (_objet modelToWorld [_distance_cam * sin _azimut_cam, _distance_cam * cos _azimut_cam, _distance_cam * 0.33]);
R3F_LOG_VIS_cam camCommit 0.05;
sleep 0.05;
};
};
};
};
/**
* Termine le mode de visualisation 3D
*/
R3F_LOG_VIS_FNCT_terminer_visualisation =
{
if (!isNull R3F_LOG_VIS_objet) then {detach R3F_LOG_VIS_objet; deleteVehicle R3F_LOG_VIS_objet;};
R3F_LOG_VIS_objet = objNull;
R3F_LOG_VIS_cam cameraEffect ["Terminate", "BACK"];
camDestroy R3F_LOG_VIS_cam;
R3F_LOG_VIS_cam = objNull;
};
/**
* Visualiser un type d'objet en 3D
*
* @param 0 le nom de classe de l'objet à visualiser
*/
R3F_LOG_VIS_FNCT_voir_objet =
{
private ["_classe_a_visualiser", "_objet", "_position_attache"];
if (isNil "R3F_LOG_VIS_cam") then
{
call R3F_LOG_VIS_FNCT_demarrer_visualisation;
};
_classe_a_visualiser = _this select 0;
// Ignorer les objets non instanciables
if (_classe_a_visualiser != "" && {isClass (configFile >> "CfgVehicles" >> _classe_a_visualiser) && {getNumber (configFile >> "CfgVehicles" >> _classe_a_visualiser >> "scope") > 0}}) then
{
// Ignorer si l'objet à visualiser est le même que précédemment
if (isNull R3F_LOG_VIS_objet || {_classe_a_visualiser != typeOf R3F_LOG_VIS_objet}) then
{
// Créer et placer l'objet dans le ciel
_position_attache = [[5000, 5000, 0]] call R3F_LOG_FNCT_3D_tirer_position_degagee_ciel;
_objet = _classe_a_visualiser createVehicleLocal _position_attache;
_objet attachTo [R3F_LOG_PUBVAR_point_attache, _position_attache];
if (!isNull R3F_LOG_VIS_objet) then {detach R3F_LOG_VIS_objet; deleteVehicle R3F_LOG_VIS_objet;};
R3F_LOG_VIS_objet = _objet;
};
};
};