Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
1
Issues
1
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Roque
erp5
Commits
bf4443ed
Commit
bf4443ed
authored
Sep 28, 2022
by
Roque
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[WEB-WORKER] [WIP] move all game logic into one file (WIP)
- drop all game logic files
parent
6a12cc76
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
0 additions
and
3543 deletions
+0
-3543
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_aaile_fixe_api_js.js
...tem/web_page_module/drone_web_worker_aaile_fixe_api_js.js
+0
-339
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_aaile_fixe_api_js.xml
...em/web_page_module/drone_web_worker_aaile_fixe_api_js.xml
+0
-342
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_drone_api_js.js
...lateItem/web_page_module/drone_web_worker_drone_api_js.js
+0
-157
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_drone_api_js.xml
...ateItem/web_page_module/drone_web_worker_drone_api_js.xml
+0
-336
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_drone_manager_js.js
...Item/web_page_module/drone_web_worker_drone_manager_js.js
+0
-601
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_drone_manager_js.xml
...tem/web_page_module/drone_web_worker_drone_manager_js.xml
+0
-342
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_log_api_js.js
...mplateItem/web_page_module/drone_web_worker_log_api_js.js
+0
-191
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_log_api_js.xml
...plateItem/web_page_module/drone_web_worker_log_api_js.xml
+0
-342
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_map_manager_js.js
...teItem/web_page_module/drone_web_worker_map_manager_js.js
+0
-144
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_map_manager_js.xml
...eItem/web_page_module/drone_web_worker_map_manager_js.xml
+0
-342
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_obstacle_manager_js.js
...m/web_page_module/drone_web_worker_obstacle_manager_js.js
+0
-67
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_obstacle_manager_js.xml
.../web_page_module/drone_web_worker_obstacle_manager_js.xml
+0
-340
No files found.
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_aaile_fixe_api_js.js
deleted
100644 → 0
View file @
6a12cc76
/// <reference path="./GameManager.ts" />
TAKEOFF_RADIUS
=
60
;
LOITER_LIMIT
=
30
;
LOITER_RADIUS_FACTOR
=
0.60
;
LOITER_SPEED_FACTOR
=
1.5
;
var
DroneAaileFixeAPI
=
/** @class */
(
function
()
{
//*************************************************** CONSTRUCTOR **************************************************
function
DroneAaileFixeAPI
(
gameManager
,
team
,
flight_parameters
)
{
this
.
_gameManager
=
gameManager
;
this
.
_team
=
team
;
this
.
_flight_parameters
=
flight_parameters
;
this
.
_loiter_radius
=
0
;
this
.
_last_loiter_point_reached
=
-
1
;
this
.
_last_altitude_point_reached
=
-
1
;
}
Object
.
defineProperty
(
DroneAaileFixeAPI
.
prototype
,
"
team
"
,
{
//*************************************************** ACCESSOR *****************************************************
get
:
function
()
{
if
(
this
.
_team
==
"
L
"
)
return
this
.
_gameManager
.
teamLeft
;
else
if
(
this
.
_team
==
"
R
"
)
return
this
.
_gameManager
.
teamRight
;
},
enumerable
:
true
,
configurable
:
true
});
//*************************************************** FUNCTIONS ****************************************************
//#region ------------------ Internal
DroneAaileFixeAPI
.
prototype
.
internal_sendMsg
=
function
(
msg
,
to
)
{
var
_this
=
this
;
_this
.
_gameManager
.
delay
(
function
()
{
if
(
to
<
0
)
{
// Send to all drones
_this
.
team
.
forEach
(
function
(
drone
)
{
if
(
drone
.
infosMesh
)
{
try
{
drone
.
onGetMsg
(
msg
);
}
catch
(
error
)
{
console
.
warn
(
'
Drone crashed on sendMsg due to error:
'
,
error
);
drone
.
_internal_crash
();
}
}
});
}
else
{
// Send to specific drone
if
(
drone
.
infosMesh
)
{
try
{
_this
.
team
[
to
].
onGetMsg
(
msg
);
}
catch
(
error
)
{
console
.
warn
(
'
Drone crashed on sendMsg due to error:
'
,
error
);
_this
.
team
[
to
].
_internal_crash
();
}
}
}
},
GAMEPARAMETERS
.
latency
.
communication
);
};
//#endregion
//#region ------------------ Accessible from AI
DroneAaileFixeAPI
.
prototype
.
log
=
function
(
msg
)
{
console
.
log
(
"
API say :
"
+
msg
);
};
DroneAaileFixeAPI
.
prototype
.
getGameParameter
=
function
(
name
)
{
if
([
"
gameTime
"
,
"
mapSize
"
,
"
teamSize
"
,
"
derive
"
,
"
meteo
"
,
"
initialHumanAreaPosition
"
].
includes
(
name
))
return
this
.
_gameManager
.
gameParameter
[
name
];
};
DroneAaileFixeAPI
.
prototype
.
_isWithinDroneView
=
function
(
drone_position
,
element_position
)
{
// Check if element is under the drone cone-view
var
angle
=
GAMEPARAMETERS
.
drone
.
viewAngle
?
GAMEPARAMETERS
.
drone
.
viewAngle
:
60
,
radius
=
drone_position
.
z
*
Math
.
tan
(
angle
/
2
*
Math
.
PI
/
180
),
distance
=
(
drone_position
.
x
-
element_position
.
x
)
*
(
drone_position
.
x
-
element_position
.
x
)
+
(
drone_position
.
y
-
element_position
.
y
)
*
(
drone_position
.
y
-
element_position
.
y
);
if
(
distance
<
(
radius
*
radius
))
return
true
;
return
false
;
};
DroneAaileFixeAPI
.
prototype
.
_getProbabilityOfDetection
=
function
(
drone_position
)
{
var
h
=
drone_position
.
z
,
km
=
GAMEPARAMETERS
.
meteo
;
prob
=
20
*
(
1
+
(
110
-
h
)
/
25
)
*
km
;
return
prob
;
};
DroneAaileFixeAPI
.
prototype
.
isHumanPositionSpottedCalculation
=
function
(
drone
)
{
var
context
=
this
,
result
=
false
,
drone_position
=
drone
.
infosMesh
.
position
;
//swap axes back
drone_position
=
{
x
:
drone_position
.
x
,
y
:
drone_position
.
z
,
z
:
drone_position
.
y
};
context
.
_gameManager
.
teamRight
.
forEach
(
function
(
human
)
{
if
(
human
.
infosMesh
&&
context
.
_isWithinDroneView
(
drone_position
,
human
.
position
))
{
var
prob
=
context
.
_getProbabilityOfDetection
(
drone_position
),
random
=
Math
.
floor
(
Math
.
random
()
*
101
);
if
(
random
<
prob
)
result
=
true
;
}
});
return
result
;
};
DroneAaileFixeAPI
.
prototype
.
isHumanPositionSpotted
=
function
(
drone
)
{
var
context
=
this
,
human_detected
;
if
(
drone
.
__is_calculating_human_position
!==
true
)
{
drone
.
__is_calculating_human_position
=
true
;
//human detection is done with the info captured by the drone
//at the moment this method is called
human_detected
=
context
.
isHumanPositionSpottedCalculation
(
drone
);
context
.
_gameManager
.
delay
(
function
()
{
drone
.
__is_calculating_human_position
=
false
;
try
{
drone
.
onCapture
(
human_detected
);
}
catch
(
error
)
{
console
.
warn
(
'
Drone crashed on capture due to error:
'
,
error
);
drone
.
_internal_crash
();
}
},
2000
);
}
};
DroneAaileFixeAPI
.
prototype
.
processCoordinates
=
function
(
lat
,
lon
,
z
,
r
)
{
if
(
isNaN
(
lat
)
||
isNaN
(
lon
)
||
isNaN
(
z
)){
throw
new
Error
(
'
Target coordinates must be numbers
'
);
}
var
flightParameters
=
this
.
getFlightParameters
();
function
longitudToX
(
lon
,
flightParameters
)
{
return
(
flightParameters
.
MAP_SIZE
/
360.0
)
*
(
180
+
lon
);
}
function
latitudeToY
(
lat
,
flightParameters
)
{
return
(
flightParameters
.
MAP_SIZE
/
180.0
)
*
(
90
-
lat
);
}
function
normalizeToMap
(
x
,
y
,
flightParameters
)
{
var
n_x
=
(
x
-
flightParameters
.
MIN_X
)
/
(
flightParameters
.
MAX_X
-
flightParameters
.
MIN_X
),
n_y
=
(
y
-
flightParameters
.
MIN_Y
)
/
(
flightParameters
.
MAX_Y
-
flightParameters
.
MIN_Y
);
return
[
n_x
*
1000
-
flightParameters
.
MAP_SIZE
/
2
,
n_y
*
1000
-
flightParameters
.
MAP_SIZE
/
2
];
}
var
x
=
longitudToX
(
lon
,
flightParameters
),
y
=
latitudeToY
(
lat
,
flightParameters
),
position
=
normalizeToMap
(
x
,
y
,
flightParameters
);
if
(
z
>
flightParameters
.
start_AMSL
)
{
z
-=
flightParameters
.
start_AMSL
;
}
var
processed_coordinates
=
{
x
:
position
[
0
],
y
:
position
[
1
],
z
:
z
};
if
(
r
&&
r
>
LOITER_LIMIT
)
{
this
.
_loiter_radius
=
r
*
LOITER_RADIUS_FACTOR
;
this
.
_loiter_center
=
processed_coordinates
;
this
.
_loiter_coordinates
=
[];
this
.
_last_loiter_point_reached
=
-
1
;
var
x1
,
y1
;
//for (var angle = 0; angle <360; angle+=8){ //counter-clockwise
for
(
var
angle
=
360
;
angle
>
0
;
angle
-=
8
){
//clockwise
x1
=
this
.
_loiter_radius
*
Math
.
cos
(
angle
*
(
Math
.
PI
/
180
))
+
this
.
_loiter_center
.
x
;
y1
=
this
.
_loiter_radius
*
Math
.
sin
(
angle
*
(
Math
.
PI
/
180
))
+
this
.
_loiter_center
.
y
;
this
.
_loiter_coordinates
.
push
(
this
.
processCurrentPosition
(
x1
,
y1
,
z
));
}
}
this
.
_last_altitude_point_reached
=
-
1
;
this
.
takeoff_path
=
[];
return
processed_coordinates
;
};
DroneAaileFixeAPI
.
prototype
.
processCurrentPosition
=
function
(
x
,
y
,
z
)
{
//convert x-y coordinates into latitud-longitude
var
flightParameters
=
this
.
getFlightParameters
();
var
lon
=
x
+
flightParameters
.
map_width
/
2
;
lon
=
lon
/
1000
;
lon
=
lon
*
(
flightParameters
.
MAX_X
-
flightParameters
.
MIN_X
)
+
flightParameters
.
MIN_X
;
lon
=
lon
/
(
flightParameters
.
map_width
/
360.0
)
-
180
;
var
lat
=
y
+
flightParameters
.
map_height
/
2
;
lat
=
lat
/
1000
;
lat
=
lat
*
(
flightParameters
.
MAX_Y
-
flightParameters
.
MIN_Y
)
+
flightParameters
.
MIN_Y
;
lat
=
90
-
lat
/
(
flightParameters
.
map_height
/
180.0
);
return
{
x
:
lat
,
y
:
lon
,
z
:
z
};
};
DroneAaileFixeAPI
.
prototype
.
loiter
=
function
(
drone
)
{
function
distance
(
c1
,
c2
)
{
var
R
=
6371
e3
,
q1
=
c1
[
0
]
*
Math
.
PI
/
180
,
q2
=
c2
[
0
]
*
Math
.
PI
/
180
,
dq
=
(
c2
[
0
]
-
c1
[
0
])
*
Math
.
PI
/
180
,
dl
=
(
c2
[
1
]
-
c1
[
1
])
*
Math
.
PI
/
180
,
a
=
Math
.
sin
(
dq
/
2
)
*
Math
.
sin
(
dq
/
2
)
+
Math
.
cos
(
q1
)
*
Math
.
cos
(
q2
)
*
Math
.
sin
(
dl
/
2
)
*
Math
.
sin
(
dl
/
2
),
c
=
2
*
Math
.
atan2
(
Math
.
sqrt
(
a
),
Math
.
sqrt
(
1
-
a
));
return
R
*
c
;
}
if
(
this
.
_loiter_radius
>
LOITER_LIMIT
)
{
var
drone_pos
=
drone
.
getCurrentPosition
();
//shift loiter circle to nearest point
if
(
this
.
_last_loiter_point_reached
===
-
1
)
{
if
(
!
this
.
shifted
)
{
drone
.
_maxSpeed
=
drone
.
_maxSpeed
*
LOITER_SPEED_FACTOR
;
var
min
=
9999
,
min_i
;
for
(
var
i
=
0
;
i
<
this
.
_loiter_coordinates
.
length
;
i
++
){
var
d
=
distance
([
drone_pos
.
x
,
drone_pos
.
y
],
[
this
.
_loiter_coordinates
[
i
].
x
,
this
.
_loiter_coordinates
[
i
].
y
]);
if
(
d
<
min
)
{
min
=
d
;
min_i
=
i
;
}
}
this
.
_loiter_coordinates
=
this
.
_loiter_coordinates
.
concat
(
this
.
_loiter_coordinates
.
splice
(
0
,
min_i
));
this
.
shifted
=
true
;
}
}
else
{
this
.
shifted
=
false
;
}
//stop
if
(
this
.
_last_loiter_point_reached
===
this
.
_loiter_coordinates
.
length
-
1
)
{
if
(
drone
.
_maxSpeed
!==
this
.
getMaxSpeed
())
{
drone
.
_maxSpeed
=
this
.
getMaxSpeed
();
}
drone
.
setDirection
(
0
,
0
,
0
);
return
;
}
//loiter
var
next_point
=
this
.
_loiter_coordinates
[
this
.
_last_loiter_point_reached
+
1
];
drone
.
setTargetCoordinates
(
next_point
.
x
,
next_point
.
y
,
next_point
.
z
,
-
1
);
if
(
distance
([
drone_pos
.
x
,
drone_pos
.
y
],
[
next_point
.
x
,
next_point
.
y
])
<
1
)
{
this
.
_last_loiter_point_reached
+=
1
;
if
(
this
.
_last_loiter_point_reached
===
this
.
_loiter_coordinates
.
length
-
1
)
{
return
;
}
next_point
=
this
.
_loiter_coordinates
[
this
.
_last_loiter_point_reached
+
1
];
drone
.
setTargetCoordinates
(
next_point
.
x
,
next_point
.
y
,
next_point
.
z
,
-
1
);
}
}
};
DroneAaileFixeAPI
.
prototype
.
getDroneAI
=
function
()
{
return
null
;
};
DroneAaileFixeAPI
.
prototype
.
setAltitude
=
function
(
altitude
,
drone
,
skip_loiter
)
{
this
.
takeoff_path
=
[];
if
(
skip_loiter
)
{
var
drone_pos
=
drone
.
getCurrentPosition
();
drone
.
setTargetCoordinates
(
drone_pos
.
x
,
drone_pos
.
y
,
altitude
);
return
;
}
var
x1
,
y1
,
LOOPS
=
1
,
CIRCLE_ANGLE
=
8
,
current_point
=
0
,
total_points
=
360
/
CIRCLE_ANGLE
*
LOOPS
,
initial_altitude
=
drone
.
getAltitudeAbs
(),
center
=
{
x
:
drone
.
_controlMesh
.
position
.
x
,
y
:
drone
.
_controlMesh
.
position
.
z
,
z
:
drone
.
_controlMesh
.
position
.
y
};
for
(
var
l
=
0
;
l
<=
LOOPS
;
l
+=
1
){
for
(
var
angle
=
360
;
angle
>
0
;
angle
-=
CIRCLE_ANGLE
){
//clockwise sense
current_point
++
;
x1
=
TAKEOFF_RADIUS
*
Math
.
cos
(
angle
*
(
Math
.
PI
/
180
))
+
center
.
x
;
y1
=
TAKEOFF_RADIUS
*
Math
.
sin
(
angle
*
(
Math
.
PI
/
180
))
+
center
.
y
;
if
(
current_point
<
total_points
/
3
)
{
var
FACTOR
=
0.5
;
x1
=
center
.
x
*
FACTOR
+
x1
*
(
1
-
FACTOR
);
y1
=
center
.
y
*
FACTOR
+
y1
*
(
1
-
FACTOR
);
}
this
.
takeoff_path
.
push
({
x
:
x1
,
y
:
y1
,
z
:
initial_altitude
+
current_point
*
(
altitude
-
initial_altitude
)
/
total_points
});
}
}
};
DroneAaileFixeAPI
.
prototype
.
reachAltitude
=
function
(
drone
)
{
function
distance
(
p1
,
p2
)
{
return
Math
.
sqrt
(
Math
.
pow
(
p1
[
0
]
-
p2
[
0
],
2
)
+
Math
.
pow
(
p1
[
1
]
-
p2
[
1
],
2
));
}
//stop
if
(
this
.
_last_altitude_point_reached
===
this
.
takeoff_path
.
length
-
1
)
{
this
.
_last_altitude_point_reached
=
-
1
;
this
.
takeoff_path
=
[];
drone
.
_start_altitude
=
0
;
drone
.
setDirection
(
0
,
0
,
0
);
return
;
}
//loiter
var
drone_pos
=
{
x
:
drone
.
_controlMesh
.
position
.
x
,
y
:
drone
.
_controlMesh
.
position
.
z
,
z
:
drone
.
_controlMesh
.
position
.
y
};
var
next_point
=
this
.
takeoff_path
[
this
.
_last_altitude_point_reached
+
1
];
drone
.
internal_setTargetCoordinates
(
next_point
.
x
,
next_point
.
y
,
next_point
.
z
);
if
(
distance
([
drone_pos
.
x
,
drone_pos
.
y
],
[
next_point
.
x
,
next_point
.
y
])
<
1
)
{
this
.
_last_altitude_point_reached
+=
1
;
if
(
this
.
_last_altitude_point_reached
===
this
.
takeoff_path
.
length
-
1
)
{
return
;
}
next_point
=
this
.
takeoff_path
[
this
.
_last_altitude_point_reached
+
1
];
drone
.
internal_setTargetCoordinates
(
next_point
.
x
,
next_point
.
y
,
next_point
.
z
);
}
};
DroneAaileFixeAPI
.
prototype
.
getMaxSpeed
=
function
()
{
return
GAMEPARAMETERS
.
drone
.
maxSpeed
;
};
DroneAaileFixeAPI
.
prototype
.
doParachute
=
function
(
drone
)
{
//TODO what to do here?
drone
.
setDirection
(
0
,
0
,
0
);
};
DroneAaileFixeAPI
.
prototype
.
landed
=
function
(
drone
)
{
var
drone_pos
=
drone
.
getCurrentPosition
();
return
Math
.
floor
(
drone_pos
.
z
)
===
0
;
};
DroneAaileFixeAPI
.
prototype
.
exit
=
function
(
drone
)
{
//TODO what to do here?
drone
.
setDirection
(
0
,
0
,
0
);
};
DroneAaileFixeAPI
.
prototype
.
getInitialAltitude
=
function
()
{
return
0
;
};
DroneAaileFixeAPI
.
prototype
.
getAltitudeAbs
=
function
(
altitude
)
{
return
altitude
;
};
DroneAaileFixeAPI
.
prototype
.
getMinHeight
=
function
()
{
return
0
;
};
DroneAaileFixeAPI
.
prototype
.
getMaxHeight
=
function
()
{
return
800
;
};
DroneAaileFixeAPI
.
prototype
.
getFlightParameters
=
function
()
{
return
this
.
_flight_parameters
;
};
return
DroneAaileFixeAPI
;
}());
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_aaile_fixe_api_js.xml
deleted
100644 → 0
View file @
6a12cc76
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Web Script"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Access_contents_information_Permission
</string>
</key>
<value>
<tuple>
<string>
Anonymous
</string>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Associate
</string>
<string>
Auditor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Add_portal_content_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Change_local_roles_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Modify_portal_content_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_View_Permission
</string>
</key>
<value>
<tuple>
<string>
Anonymous
</string>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Associate
</string>
<string>
Auditor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
content_md5
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
DroneAaileFixeAPI.js
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
drone_web_worker_aaile_fixe_api_js
</string>
</value>
</item>
<item>
<key>
<string>
language
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Web Script
</string>
</value>
</item>
<item>
<key>
<string>
short_title
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Drone Aaile Fixe API JS
</string>
</value>
</item>
<item>
<key>
<string>
version
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
document_publication_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
edit_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAQ=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
processing_status_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAU=
</string>
</persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
publish_alive
</string>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1662556209.39
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
validation_state
</string>
</key>
<value>
<string>
published_alive
</string>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"4"
aka=
"AAAAAAAAAAQ="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
edit
</string>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
1003.4484.47794.56558
</string>
</value>
</item>
<item>
<key>
<string>
state
</string>
</key>
<value>
<string>
current
</string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1663611202.23
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"5"
aka=
"AAAAAAAAAAU="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
external_processing_state
</string>
</key>
<value>
<string>
empty
</string>
</value>
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
0.0.0.0
</string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1662555990.53
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_drone_api_js.js
deleted
100644 → 0
View file @
6a12cc76
/// <reference path="./GameManager.ts" />
var
DroneAPI
=
/** @class */
(
function
()
{
//*************************************************** CONSTRUCTOR **************************************************
function
DroneAPI
(
gameManager
,
team
)
{
this
.
_gameManager
=
gameManager
;
this
.
_team
=
team
;
}
Object
.
defineProperty
(
DroneAPI
.
prototype
,
"
team
"
,
{
//*************************************************** ACCESSOR *****************************************************
get
:
function
()
{
if
(
this
.
_team
==
"
L
"
)
return
this
.
_gameManager
.
teamLeft
;
else
if
(
this
.
_team
==
"
R
"
)
return
this
.
_gameManager
.
teamRight
;
},
enumerable
:
true
,
configurable
:
true
});
//*************************************************** FUNCTIONS ****************************************************
//#region ------------------ Internal
DroneAPI
.
prototype
.
internal_sendMsg
=
function
(
msg
,
to
)
{
var
_this
=
this
;
_this
.
_gameManager
.
delay
(
function
()
{
if
(
to
<
0
)
{
// Send to all drones
_this
.
team
.
forEach
(
function
(
drone
)
{
if
(
drone
.
infosMesh
)
{
try
{
drone
.
onGetMsg
(
msg
);
}
catch
(
error
)
{
console
.
warn
(
'
Drone crashed on sendMsg due to error:
'
,
error
);
drone
.
_internal_crash
();
}
}
});
}
else
{
// Send to specific drone
if
(
drone
.
infosMesh
)
{
try
{
_this
.
team
[
to
].
onGetMsg
(
msg
);
}
catch
(
error
)
{
console
.
warn
(
'
Drone crashed on sendMsg due to error:
'
,
error
);
_this
.
team
[
to
].
_internal_crash
();
}
}
}
},
GAMEPARAMETERS
.
latency
.
communication
);
};
//#endregion
//#region ------------------ Accessible from AI
DroneAPI
.
prototype
.
log
=
function
(
msg
)
{
console
.
log
(
"
API say :
"
+
msg
);
};
DroneAPI
.
prototype
.
getGameParameter
=
function
(
name
)
{
if
([
"
gameTime
"
,
"
mapSize
"
,
"
teamSize
"
,
"
derive
"
,
"
meteo
"
,
"
initialHumanAreaPosition
"
].
includes
(
name
))
return
this
.
_gameManager
.
gameParameter
[
name
];
};
DroneAPI
.
prototype
.
_isWithinDroneView
=
function
(
drone_position
,
element_position
)
{
// Check if element is under the drone cone-view
var
angle
=
GAMEPARAMETERS
.
drone
.
viewAngle
?
GAMEPARAMETERS
.
drone
.
viewAngle
:
60
,
radius
=
drone_position
.
z
*
Math
.
tan
(
angle
/
2
*
Math
.
PI
/
180
),
distance
=
(
drone_position
.
x
-
element_position
.
x
)
*
(
drone_position
.
x
-
element_position
.
x
)
+
(
drone_position
.
y
-
element_position
.
y
)
*
(
drone_position
.
y
-
element_position
.
y
);
if
(
distance
<
(
radius
*
radius
))
return
true
;
return
false
;
};
DroneAPI
.
prototype
.
_getProbabilityOfDetection
=
function
(
drone_position
)
{
var
h
=
drone_position
.
z
,
km
=
GAMEPARAMETERS
.
meteo
;
prob
=
20
*
(
1
+
(
110
-
h
)
/
25
)
*
km
;
return
prob
;
};
DroneAPI
.
prototype
.
isHumanPositionSpottedCalculation
=
function
(
drone
)
{
var
context
=
this
,
result
=
false
,
drone_position
=
drone
.
infosMesh
.
position
;
//swap axes back
drone_position
=
{
x
:
drone_position
.
x
,
y
:
drone_position
.
z
,
z
:
drone_position
.
y
};
context
.
_gameManager
.
teamRight
.
forEach
(
function
(
human
)
{
if
(
human
.
infosMesh
&&
context
.
_isWithinDroneView
(
drone_position
,
human
.
position
))
{
var
prob
=
context
.
_getProbabilityOfDetection
(
drone_position
),
random
=
Math
.
floor
(
Math
.
random
()
*
101
);
if
(
random
<
prob
)
result
=
true
;
}
});
return
result
;
};
DroneAPI
.
prototype
.
isHumanPositionSpotted
=
function
(
drone
)
{
var
context
=
this
,
human_detected
;
if
(
drone
.
__is_calculating_human_position
!==
true
)
{
drone
.
__is_calculating_human_position
=
true
;
//human detection is done with the info captured by the drone
//at the moment this method is called
human_detected
=
context
.
isHumanPositionSpottedCalculation
(
drone
);
context
.
_gameManager
.
delay
(
function
()
{
drone
.
__is_calculating_human_position
=
false
;
try
{
drone
.
onCapture
(
human_detected
);
}
catch
(
error
)
{
console
.
warn
(
'
Drone crashed on capture due to error:
'
,
error
);
drone
.
_internal_crash
();
}
},
2000
);
}
};
DroneAPI
.
prototype
.
getDirectionFromCoordinates
=
function
(
x
,
y
,
z
,
drone_position
)
{
if
(
isNaN
(
x
)
||
isNaN
(
y
)
||
isNaN
(
z
)){
throw
new
Error
(
'
Target coordinates must be numbers
'
);
}
x
-=
drone_position
.
x
;
y
-=
drone_position
.
y
;
z
-=
drone_position
.
z
;
if
(
this
.
_team
==
"
R
"
)
y
=
-
y
;
return
{
x
:
x
,
y
:
y
,
z
:
z
};
};
DroneAPI
.
prototype
.
setAltitude
=
function
(
altitude
)
{
//TODO
return
;
};
DroneAPI
.
prototype
.
getInitialAltitude
=
function
()
{
return
0
;
};
DroneAPI
.
prototype
.
getAltitudeAbs
=
function
()
{
return
0
;
};
DroneAPI
.
prototype
.
getMinHeight
=
function
()
{
return
9
;
};
DroneAPI
.
prototype
.
getMaxHeight
=
function
()
{
return
220
;
};
DroneAPI
.
prototype
.
getDroneAI
=
function
()
{
return
null
;
};
DroneAPI
.
prototype
.
getMaxSpeed
=
function
()
{
return
GAMEPARAMETERS
.
drone
.
maxSpeed
;
};
return
DroneAPI
;
}());
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_drone_api_js.xml
deleted
100644 → 0
View file @
6a12cc76
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Web Script"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Access_contents_information_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Add_portal_content_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Change_local_roles_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Modify_portal_content_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_View_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
content_md5
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
DroneAPI.js
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
drone_web_worker_drone_api_js
</string>
</value>
</item>
<item>
<key>
<string>
language
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Web Script
</string>
</value>
</item>
<item>
<key>
<string>
short_title
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Drone API JS
</string>
</value>
</item>
<item>
<key>
<string>
version
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
document_publication_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
edit_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAQ=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
processing_status_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAU=
</string>
</persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
hide
</string>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1664301067.15
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
validation_state
</string>
</key>
<value>
<string>
hidden
</string>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"4"
aka=
"AAAAAAAAAAQ="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
edit
</string>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
1002.52438.8605.21913
</string>
</value>
</item>
<item>
<key>
<string>
state
</string>
</key>
<value>
<string>
current
</string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1662556286.54
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"5"
aka=
"AAAAAAAAAAU="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
external_processing_state
</string>
</key>
<value>
<string>
empty
</string>
</value>
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
0.0.0.0
</string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1662555993.71
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_drone_manager_js.js
deleted
100644 → 0
View file @
6a12cc76
/// <reference path="./typings/babylon.3.1.d.ts" />
/// <reference path="./DroneAPI.ts" />
/// <reference path="./DroneLogAPI.ts" />
/// <reference path="./DroneAaileFixeAPI.ts" />
var
DroneManager
=
/** @class */
(
function
()
{
//*************************************************** CONSTRUCTOR **************************************************
function
DroneManager
(
scene
,
id
,
team
,
API
)
{
var
_this
=
this
;
// Mesh
this
.
_mesh
=
null
;
this
.
_controlMesh
=
null
;
this
.
_colliderBackMesh
=
null
;
this
.
_canPlay
=
false
;
this
.
_canCommunicate
=
false
;
this
.
_maxAcceleration
=
0
;
this
.
_maxSpeed
=
0
;
this
.
_speed
=
0
;
this
.
_acceleration
=
0
;
this
.
_direction
=
BABYLON
.
Vector3
.
Zero
();
this
.
_rotationSpeed
=
0.4
;
this
.
_maxOrientation
=
Math
.
PI
/
4
;
this
.
_scene
=
scene
;
this
.
_canUpdate
=
true
;
this
.
_id
=
id
;
this
.
_leader_id
=
0
;
this
.
_team
=
team
;
this
.
_start_loiter
=
0
;
this
.
_start_altitude
=
0
;
this
.
_API
=
API
;
// var API created on AI evel
// Create the control mesh
this
.
_controlMesh
=
BABYLON
.
Mesh
.
CreateBox
(
"
droneControl_
"
+
id
,
0.01
,
this
.
_scene
);
this
.
_controlMesh
.
isVisible
=
false
;
if
(
this
.
_team
==
"
R
"
)
this
.
_controlMesh
.
rotation
=
new
BABYLON
.
Vector3
(
0
,
Math
.
PI
,
0
);
this
.
_controlMesh
.
computeWorldMatrix
(
true
);
// Create the mesh from the drone prefab
this
.
_mesh
=
DroneManager
.
Prefab
.
clone
(
"
drone_
"
+
id
,
this
.
_controlMesh
);
this
.
_mesh
.
position
=
BABYLON
.
Vector3
.
Zero
();
this
.
_mesh
.
isVisible
=
false
;
this
.
_mesh
.
computeWorldMatrix
(
true
);
// Get the back collider
this
.
_mesh
.
getChildMeshes
().
forEach
(
function
(
mesh
)
{
if
(
mesh
.
name
.
substring
(
mesh
.
name
.
length
-
13
)
==
"
Dummy_arriere
"
)
{
_this
.
_colliderBackMesh
=
mesh
;
_this
.
_colliderBackMesh
.
isVisible
=
false
;
}
else
{
if
(
_this
.
_team
!==
"
R
"
)
{
mesh
.
isVisible
=
true
;
}
else
{
mesh
.
isVisible
=
false
;
_this
.
_colliderBackMesh
=
mesh
;
_this
.
_colliderBackMesh
.
isVisible
=
false
;
}
}
});
// Team color
if
(
!
DroneManager
.
PrefabBlueMat
||
!
DroneManager
.
PrefabRedMat
)
{
DroneManager
.
PrefabBlueMat
=
new
BABYLON
.
StandardMaterial
(
"
blueTeamMat
"
,
scene
);
DroneManager
.
PrefabBlueMat
.
diffuseTexture
=
new
BABYLON
.
Texture
(
"
assets/drone/drone_bleu.jpg
"
,
scene
);
DroneManager
.
PrefabRedMat
=
new
BABYLON
.
StandardMaterial
(
"
redTeamMat
"
,
scene
);
DroneManager
.
PrefabRedMat
.
diffuseTexture
=
new
BABYLON
.
Texture
(
"
assets/drone/drone_rouge.jpg
"
,
scene
);
}
this
.
_propellerAnimMeshes
=
[];
this
.
_mesh
.
getChildren
().
forEach
(
function
(
mesh
)
{
// Propeller animation
if
(
mesh
.
name
.
substring
(
mesh
.
name
.
length
-
7
,
mesh
.
name
.
length
-
1
)
==
"
helice
"
)
{
var
anim
=
new
BABYLON
.
Animation
(
"
propellerTurning_
"
+
mesh
.
name
,
"
rotation.y
"
,
20
,
BABYLON
.
Animation
.
ANIMATIONTYPE_FLOAT
,
BABYLON
.
Animation
.
ANIMATIONLOOPMODE_CYCLE
);
var
keys
=
[
{
frame
:
0
,
value
:
0
},
{
frame
:
2
,
value
:
Math
.
PI
},
{
frame
:
4
,
value
:
Math
.
PI
*
2
}
];
anim
.
setKeys
(
keys
);
mesh
.
animations
.
push
(
anim
);
_this
.
_scene
.
beginAnimation
(
mesh
,
0
,
4
,
true
);
_this
.
_propellerAnimMeshes
.
push
(
mesh
);
}
else
{
if
(
_this
.
_team
==
"
L
"
)
{
mesh
.
material
=
DroneManager
.
PrefabBlueMat
;
}
else
if
(
_this
.
_team
==
"
R
"
)
{
mesh
.
material
=
DroneManager
.
PrefabRedMat
;
}
}
});
}
DroneManager
.
prototype
.
_swapAxe
=
function
(
vector
)
{
return
new
BABYLON
.
Vector3
(
vector
.
x
,
vector
.
z
,
vector
.
y
);
};
Object
.
defineProperty
(
DroneManager
.
prototype
,
"
leader_id
"
,
{
//*************************************************** ACCESSOR *****************************************************
get
:
function
()
{
return
this
.
_leader_id
;
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
DroneManager
.
prototype
,
"
id
"
,
{
//*************************************************** ACCESSOR *****************************************************
get
:
function
()
{
return
this
.
_id
;
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
DroneManager
.
prototype
,
"
team
"
,
{
get
:
function
()
{
return
this
.
_team
;
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
DroneManager
.
prototype
,
"
colliderMesh
"
,
{
get
:
function
()
{
return
this
.
_mesh
;
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
DroneManager
.
prototype
,
"
colliderBackMesh
"
,
{
get
:
function
()
{
return
this
.
_colliderBackMesh
;
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
DroneManager
.
prototype
,
"
infosMesh
"
,
{
get
:
function
()
{
return
this
.
_controlMesh
;
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
DroneManager
.
prototype
,
"
position
"
,
{
get
:
function
()
{
if
(
this
.
_controlMesh
!==
null
)
{
return
this
.
_swapAxe
(
this
.
_controlMesh
.
position
);
}
return
null
;
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
DroneManager
.
prototype
,
"
rotation
"
,
{
get
:
function
()
{
return
this
.
_swapAxe
(
this
.
_controlMesh
.
rotation
);
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
DroneManager
.
prototype
,
"
speed
"
,
{
get
:
function
()
{
return
this
.
_speed
;
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
DroneManager
.
prototype
,
"
direction
"
,
{
get
:
function
()
{
return
this
.
_swapAxe
(
this
.
_direction
);
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
DroneManager
.
prototype
,
"
worldDirection
"
,
{
get
:
function
()
{
var
t
=
this
.
team
===
"
L
"
?
1
:
-
1
;
return
new
BABYLON
.
Vector3
(
t
*
this
.
_direction
.
x
,
this
.
_direction
.
y
,
t
*
this
.
_direction
.
z
);
},
enumerable
:
true
,
configurable
:
true
});
//*************************************************** FUNCTIONS ****************************************************
//#region ------------------ Internal
// Function called by the GameManager
// Set internal variables then call API function
DroneManager
.
prototype
.
internal_start
=
function
()
{
this
.
_maxAcceleration
=
GAMEPARAMETERS
.
drone
.
maxAcceleration
;
if
(
this
.
_team
==
"
R
"
)
{
if
(
GAMEPARAMETERS
.
derive
)
{
this
.
_maxSpeed
=
GAMEPARAMETERS
.
derive
.
speed
;
}
else
{
this
.
_maxSpeed
=
0
;
}
}
else
{
this
.
_maxSpeed
=
this
.
_API
.
getMaxSpeed
();
}
this
.
_canPlay
=
true
;
this
.
_canCommunicate
=
true
;
try
{
return
this
.
onStart
();
}
catch
(
error
)
{
console
.
warn
(
'
Drone crashed on start due to error:
'
,
error
);
this
.
_internal_crash
();
}
};
/**
* Set a target point to move
*/
DroneManager
.
prototype
.
internal_setTargetCoordinates
=
function
(
x
,
y
,
z
)
{
if
(
!
this
.
_canPlay
)
return
;
x
-=
this
.
_controlMesh
.
position
.
x
;
y
-=
this
.
_controlMesh
.
position
.
z
;
z
-=
this
.
_controlMesh
.
position
.
y
;
this
.
setDirection
(
x
,
y
,
z
);
this
.
setAcceleration
(
this
.
_maxAcceleration
);
return
;
};
DroneManager
.
prototype
.
internal_update
=
function
(
delta_time
)
{
var
context
=
this
;
if
(
this
.
_controlMesh
)
{
if
(
context
.
_rotationTarget
)
{
var
rotStep
=
BABYLON
.
Vector3
.
Zero
();
var
diff
=
context
.
_rotationTarget
.
subtract
(
context
.
_controlMesh
.
rotation
);
if
(
diff
.
x
>=
1
)
rotStep
.
x
=
1
;
else
rotStep
.
x
=
diff
.
x
;
if
(
diff
.
y
>=
1
)
rotStep
.
y
=
1
;
else
rotStep
.
y
=
diff
.
y
;
if
(
diff
.
z
>=
1
)
rotStep
.
z
=
1
;
else
rotStep
.
z
=
diff
.
z
;
if
(
rotStep
==
BABYLON
.
Vector3
.
Zero
())
{
context
.
_rotationTarget
=
null
;
return
;
}
var
newrot
=
new
BABYLON
.
Vector3
(
context
.
_controlMesh
.
rotation
.
x
+
(
rotStep
.
x
*
context
.
_rotationSpeed
),
context
.
_controlMesh
.
rotation
.
y
+
(
rotStep
.
y
*
context
.
_rotationSpeed
),
context
.
_controlMesh
.
rotation
.
z
+
(
rotStep
.
z
*
context
.
_rotationSpeed
));
context
.
_controlMesh
.
rotation
=
newrot
;
}
context
.
_speed
+=
context
.
_acceleration
*
delta_time
/
1000
;
if
(
context
.
_speed
>
context
.
_maxSpeed
)
context
.
_speed
=
context
.
_maxSpeed
;
if
(
context
.
_speed
<
-
context
.
_maxSpeed
)
context
.
_speed
=
-
context
.
_maxSpeed
;
var
updateSpeed
=
context
.
_speed
*
delta_time
/
1000
;
if
(
context
.
_direction
.
x
!=
0
||
context
.
_direction
.
y
!=
0
||
context
.
_direction
.
z
!=
0
)
{
context
.
_controlMesh
.
position
.
addInPlace
(
new
BABYLON
.
Vector3
(
context
.
_direction
.
x
*
updateSpeed
,
context
.
_direction
.
y
*
updateSpeed
,
context
.
_direction
.
z
*
updateSpeed
));
}
var
orientationValue
=
context
.
_maxOrientation
*
(
context
.
_speed
/
context
.
_maxSpeed
);
context
.
_mesh
.
rotation
=
new
BABYLON
.
Vector3
(
orientationValue
*
context
.
_direction
.
z
,
0
,
-
orientationValue
*
context
.
_direction
.
x
);
context
.
_controlMesh
.
computeWorldMatrix
(
true
);
context
.
_mesh
.
computeWorldMatrix
(
true
);
if
(
context
.
_canUpdate
)
{
context
.
_canUpdate
=
false
;
return
new
RSVP
.
Queue
()
.
push
(
function
()
{
return
context
.
onUpdate
(
context
.
_API
.
_gameManager
.
_game_duration
);
})
.
push
(
function
()
{
context
.
_canUpdate
=
true
;
},
function
(
err
)
{
console
.
warn
(
'
Drone crashed on update due to error:
'
,
err
);
context
.
_internal_crash
();
})
.
push
(
function
()
{
if
(
context
.
_start_loiter
>
0
)
{
context
.
_API
.
loiter
(
context
);
}
if
(
context
.
_start_altitude
>
0
)
{
context
.
_API
.
reachAltitude
(
context
);
}
});
}
return
;
}
return
;
};
DroneManager
.
prototype
.
internal_touch
=
function
()
{
var
_this
=
this
;
this
.
setRotationBy
(
0
,
0
,
0
);
this
.
setDirection
(
0
,
0
,
-
1
);
this
.
setAcceleration
(
this
.
_maxAcceleration
);
this
.
_canPlay
=
false
;
if
(
this
.
_propellerAnimMeshes
!=
null
)
{
try
{
this
.
_propellerAnimMeshes
.
forEach
(
function
(
mesh
)
{
_this
.
_scene
.
stopAnimation
(
mesh
);
});
}
catch
(
ex
)
{
}
this
.
_propellerAnimMeshes
=
null
;
}
this
.
_canCommunicate
=
false
;
this
.
_controlMesh
=
null
;
this
.
_mesh
=
null
;
this
.
onTouched
();
};
DroneManager
.
prototype
.
_internal_crash
=
function
()
{
var
_this
=
this
;
if
(
this
.
_propellerAnimMeshes
!==
null
)
{
try
{
this
.
_propellerAnimMeshes
.
forEach
(
function
(
mesh
)
{
_this
.
_scene
.
stopAnimation
(
mesh
);
});
}
catch
(
ex
)
{
}
this
.
_propellerAnimMeshes
=
null
;
}
this
.
_canCommunicate
=
false
;
this
.
_controlMesh
=
null
;
this
.
_mesh
=
null
;
this
.
_canPlay
=
false
;
this
.
onTouched
();
this
.
_API
.
_gameManager
.
_onDroneInternalCrash
(
this
);
};
DroneManager
.
prototype
.
_internal_dispose
=
function
()
{
if
(
this
.
_mesh
)
{
this
.
_mesh
.
dispose
();
this
.
_mesh
=
null
;
this
.
_controlMesh
.
dispose
();
this
.
_controlMesh
=
null
;
}
};
DroneManager
.
prototype
.
internal_finish
=
function
()
{
this
.
_canPlay
=
false
;
this
.
_canCommunicate
=
false
;
this
.
_controlMesh
=
null
;
};
DroneManager
.
prototype
.
can_play
=
function
()
{
return
this
.
_canPlay
;
};
//#endregion
//#region ------------------ Accessible from AI
// Function callable by "me.functionName()" in AI code
// -- Starting info
/**
* Set the starting position of the drone
* Take x,y,z coordinates as parameters
*/
DroneManager
.
prototype
.
setStartingPosition
=
function
(
x
,
y
,
z
)
{
if
(
isNaN
(
x
)
||
isNaN
(
y
)
||
isNaN
(
z
)){
throw
new
Error
(
'
Position coordinates must be numbers
'
);
}
if
(
!
this
.
_canPlay
)
{
if
(
z
<=
0.05
)
z
=
0.05
;
this
.
_controlMesh
.
position
=
new
BABYLON
.
Vector3
(
x
,
z
,
y
);
}
this
.
_controlMesh
.
computeWorldMatrix
(
true
);
this
.
_mesh
.
computeWorldMatrix
(
true
);
};
//#region -- Movements
/**
* Set the drone acceleration
* It is in meter / second
*/
DroneManager
.
prototype
.
setAcceleration
=
function
(
factor
)
{
if
(
!
this
.
_canPlay
)
return
;
if
(
isNaN
(
factor
)){
throw
new
Error
(
'
Acceleration must be a number
'
);
}
if
(
factor
>
this
.
_maxAcceleration
)
factor
=
this
.
_maxAcceleration
;
this
.
_acceleration
=
factor
;
};
//#region -- Movements
/**
* Set the human derive acceleration
* It is in meter / second
* It has no cap to allow constant speed
*/
DroneManager
.
prototype
.
setHumanAcceleration
=
function
(
factor
)
{
if
(
!
this
.
_canPlay
)
return
;
if
(
isNaN
(
factor
)){
throw
new
Error
(
'
Acceleration must be a number
'
);
}
this
.
_acceleration
=
factor
;
};
/**
* Set the drone direction
*/
DroneManager
.
prototype
.
setDirection
=
function
(
x
,
y
,
z
)
{
if
(
!
this
.
_canPlay
)
return
;
if
(
isNaN
(
x
)
||
isNaN
(
y
)
||
isNaN
(
z
)){
throw
new
Error
(
'
Direction coordinates must be numbers
'
);
}
this
.
_direction
=
new
BABYLON
.
Vector3
(
x
,
z
,
y
).
normalize
();
};
/**
* Set the drone rotation
*/
DroneManager
.
prototype
.
setRotation
=
function
(
x
,
y
,
z
)
{
if
(
!
this
.
_canPlay
)
return
;
if
(
this
.
_team
==
"
R
"
)
y
+=
Math
.
PI
;
this
.
_rotationTarget
=
new
BABYLON
.
Vector3
(
x
,
z
,
y
);
};
/**
* Add this rotation to the actual drone rotation
*/
DroneManager
.
prototype
.
setRotationBy
=
function
(
x
,
y
,
z
)
{
if
(
!
this
.
_canPlay
)
return
;
this
.
_rotationTarget
=
new
BABYLON
.
Vector3
(
this
.
rotation
.
x
+
x
,
this
.
rotation
.
y
+
z
,
this
.
rotation
.
z
+
y
);
};
/**
* Set a target point to move
*/
DroneManager
.
prototype
.
setTargetCoordinates
=
function
(
x
,
y
,
z
,
r
)
{
if
(
!
this
.
_canPlay
)
return
;
//HACK too specific for DroneAaileFixe, should be a flag: (bool)process?
if
(
r
!==
-
1
)
{
this
.
_start_loiter
=
0
;
this
.
_maxSpeed
=
this
.
_API
.
getMaxSpeed
();
}
this
.
_start_altitude
=
0
;
var
coordinates
=
this
.
_API
.
processCoordinates
(
x
,
y
,
z
,
r
);
coordinates
.
x
-=
this
.
_controlMesh
.
position
.
x
;
coordinates
.
y
-=
this
.
_controlMesh
.
position
.
z
;
coordinates
.
z
-=
this
.
_controlMesh
.
position
.
y
;
if
(
this
.
team
==
"
R
"
)
coordinates
.
y
=
-
coordinates
.
y
;
this
.
setDirection
(
coordinates
.
x
,
coordinates
.
y
,
coordinates
.
z
);
this
.
setAcceleration
(
this
.
_maxAcceleration
);
return
;
};
//#endregion
//#region -- Messaging
/**
* Send a message to team drones
* @param msg The message to send
* @param id The targeted drone. -1 or nothing to broadcast
*/
DroneManager
.
prototype
.
sendMsg
=
function
(
msg
,
id
)
{
//TODO
return
;
var
_this
=
this
;
if
(
!
this
.
_canCommunicate
)
return
;
if
(
id
>=
0
)
{
}
else
id
=
-
1
;
if
(
_this
.
infosMesh
)
{
return
_this
.
_API
.
internal_sendMsg
(
JSON
.
parse
(
JSON
.
stringify
(
msg
)),
id
);
}
};
/**
* Perform a console.log with drone id + the message
*/
DroneManager
.
prototype
.
log
=
function
(
msg
)
{
};
//#endregion
//#region -- Game informations
/**
* Get drone max height
*/
DroneManager
.
prototype
.
getMaxHeight
=
function
()
{
return
this
.
_API
.
getMaxHeight
();
};
/**
* Get drone min height
*/
DroneManager
.
prototype
.
getMinHeight
=
function
()
{
return
this
.
_API
.
getMinHeight
();
};
/**
* Get drone initial altitude
*/
DroneManager
.
prototype
.
getInitialAltitude
=
function
()
{
return
this
.
_API
.
getInitialAltitude
();
};
/**
* Get drone absolute altitude
*/
DroneManager
.
prototype
.
getAltitudeAbs
=
function
()
{
if
(
this
.
_controlMesh
)
{
var
altitude
=
this
.
_controlMesh
.
position
.
y
;
return
this
.
_API
.
getAltitudeAbs
(
altitude
);
}
return
null
;
};
/**
* Get a game parameter by name
* @param name Name of the parameter to retrieve
*/
DroneManager
.
prototype
.
getGameParameter
=
function
(
name
)
{
if
(
!
this
.
_canCommunicate
)
return
;
return
this
.
_API
.
getGameParameter
(
name
);
};
/**
* get if drone detects the human position
*/
DroneManager
.
prototype
.
isHumanPositionSpotted
=
function
()
{
if
(
!
this
.
_canCommunicate
)
return
;
return
this
.
_API
.
isHumanPositionSpotted
(
this
);
};
/**
* get current drone position
*/
DroneManager
.
prototype
.
getCurrentPosition
=
function
()
{
if
(
this
.
_controlMesh
)
return
this
.
_API
.
processCurrentPosition
(
this
.
_controlMesh
.
position
.
x
,
this
.
_controlMesh
.
position
.
z
,
this
.
_controlMesh
.
position
.
y
);
return
null
;
};
/**
* Set the drone altitude
* @param altitude information to be set
*/
DroneManager
.
prototype
.
setAltitude
=
function
(
altitude
,
skip_loiter
)
{
if
(
!
this
.
_canPlay
)
return
;
if
(
this
.
_start_altitude
===
0
)
{
this
.
_start_altitude
=
1
;
}
altitude
=
this
.
_API
.
setAltitude
(
altitude
,
this
,
skip_loiter
);
return
;
};
/**
* Make the drone loiter
*/
DroneManager
.
prototype
.
loiter
=
function
()
{
if
(
!
this
.
_canPlay
)
return
;
if
(
this
.
_start_loiter
===
0
)
{
this
.
_start_loiter
=
1
;
}
};
/**
* Set the reported human position
* @param position information to be set
*/
DroneManager
.
prototype
.
reportHumanPosition
=
function
(
position
)
{
this
.
_API
.
_gameManager
.
reportHumanPosition
(
position
);
};
/**
* get log flight parameters
*/
DroneManager
.
prototype
.
getFlightParameters
=
function
()
{
if
(
this
.
_API
.
getFlightParameters
)
return
this
.
_API
.
getFlightParameters
();
return
null
;
};
/**
* get yaw flight parameters
*/
DroneManager
.
prototype
.
getYaw
=
function
()
{
//TODO
return
0
;
};
/**
* do parachute
*/
DroneManager
.
prototype
.
doParachute
=
function
()
{
return
this
.
_API
.
doParachute
(
this
);
};
/**
* exit
*/
DroneManager
.
prototype
.
exit
=
function
()
{
return
this
.
_API
.
exit
(
this
);
};
/**
* landed
*/
DroneManager
.
prototype
.
landed
=
function
()
{
return
this
.
_API
.
landed
(
this
);
};
/**
* Set the drone last checkpoint reached
* @param checkpoint to be set
*/
DroneManager
.
prototype
.
setCheckpoint
=
function
(
checkpoint
)
{
//TODO
return
null
;
};
//#endregion
//#endregion
//#region ------------------ To be defined in AI code
// Function called on evt.
// These functions must be defined in the AI code
/**
* Function called on game start
*/
DroneManager
.
prototype
.
onStart
=
function
()
{
};
;
/**
* Function called on game update
*/
DroneManager
.
prototype
.
onUpdate
=
function
(
timestamp
)
{
};
;
/**
* Function called when drone die (crash or collision)
*/
DroneManager
.
prototype
.
onTouched
=
function
()
{
};
;
/**
* Function called when a message is received
* @param msg The message
*/
DroneManager
.
prototype
.
onGetMsg
=
function
(
msg
)
{
};
;
/**
* Function called when drone finishes the detection process
* @param human_detected true or false
*/
DroneManager
.
prototype
.
onCapture
=
function
(
human_detected
)
{
};
;
return
DroneManager
;
}());
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_drone_manager_js.xml
deleted
100644 → 0
View file @
6a12cc76
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Web Script"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Access_contents_information_Permission
</string>
</key>
<value>
<tuple>
<string>
Anonymous
</string>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Associate
</string>
<string>
Auditor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Add_portal_content_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Change_local_roles_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Modify_portal_content_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_View_Permission
</string>
</key>
<value>
<tuple>
<string>
Anonymous
</string>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Associate
</string>
<string>
Auditor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
content_md5
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
DroneManager.js
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
drone_web_worker_drone_manager_js
</string>
</value>
</item>
<item>
<key>
<string>
language
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Web Script
</string>
</value>
</item>
<item>
<key>
<string>
short_title
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Drone Manager JS
</string>
</value>
</item>
<item>
<key>
<string>
version
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
document_publication_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
edit_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAQ=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
processing_status_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAU=
</string>
</persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
publish_alive
</string>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1662556210.06
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
validation_state
</string>
</key>
<value>
<string>
published_alive
</string>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"4"
aka=
"AAAAAAAAAAQ="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
edit
</string>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
1003.4485.30969.53230
</string>
</value>
</item>
<item>
<key>
<string>
state
</string>
</key>
<value>
<string>
current
</string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1663614606.63
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"5"
aka=
"AAAAAAAAAAU="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
external_processing_state
</string>
</key>
<value>
<string>
empty
</string>
</value>
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
0.0.0.0
</string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1662555985.78
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_log_api_js.js
deleted
100644 → 0
View file @
6a12cc76
/// <reference path="./GameManager.ts" />
var
DroneLogAPI
=
/** @class */
(
function
()
{
//*************************************************** CONSTRUCTOR **************************************************
function
DroneLogAPI
(
gameManager
,
team
,
flight_parameters
)
{
this
.
_gameManager
=
gameManager
;
this
.
_team
=
team
;
this
.
_flight_parameters
=
flight_parameters
;
}
Object
.
defineProperty
(
DroneLogAPI
.
prototype
,
"
team
"
,
{
//*************************************************** ACCESSOR *****************************************************
get
:
function
()
{
if
(
this
.
_team
==
"
L
"
)
return
this
.
_gameManager
.
teamLeft
;
else
if
(
this
.
_team
==
"
R
"
)
return
this
.
_gameManager
.
teamRight
;
},
enumerable
:
true
,
configurable
:
true
});
//*************************************************** FUNCTIONS ****************************************************
//#region ------------------ Internal
DroneLogAPI
.
prototype
.
internal_sendMsg
=
function
(
msg
,
to
)
{
var
_this
=
this
;
_this
.
_gameManager
.
delay
(
function
()
{
if
(
to
<
0
)
{
// Send to all drones
_this
.
team
.
forEach
(
function
(
drone
)
{
if
(
drone
.
infosMesh
)
{
try
{
drone
.
onGetMsg
(
msg
);
}
catch
(
error
)
{
console
.
warn
(
'
Drone crashed on sendMsg due to error:
'
,
error
);
drone
.
_internal_crash
();
}
}
});
}
else
{
// Send to specific drone
if
(
drone
.
infosMesh
)
{
try
{
_this
.
team
[
to
].
onGetMsg
(
msg
);
}
catch
(
error
)
{
console
.
warn
(
'
Drone crashed on sendMsg due to error:
'
,
error
);
_this
.
team
[
to
].
_internal_crash
();
}
}
}
},
GAMEPARAMETERS
.
latency
.
communication
);
};
//#endregion
//#region ------------------ Accessible from AI
DroneLogAPI
.
prototype
.
log
=
function
(
msg
)
{
console
.
log
(
"
API say :
"
+
msg
);
};
DroneLogAPI
.
prototype
.
getGameParameter
=
function
(
name
)
{
if
([
"
gameTime
"
,
"
mapSize
"
,
"
teamSize
"
,
"
derive
"
,
"
meteo
"
,
"
initialHumanAreaPosition
"
].
includes
(
name
))
return
this
.
_gameManager
.
gameParameter
[
name
];
};
DroneLogAPI
.
prototype
.
_isWithinDroneView
=
function
(
drone_position
,
element_position
)
{
// Check if element is under the drone cone-view
var
angle
=
GAMEPARAMETERS
.
drone
.
viewAngle
?
GAMEPARAMETERS
.
drone
.
viewAngle
:
60
,
radius
=
drone_position
.
z
*
Math
.
tan
(
angle
/
2
*
Math
.
PI
/
180
),
distance
=
(
drone_position
.
x
-
element_position
.
x
)
*
(
drone_position
.
x
-
element_position
.
x
)
+
(
drone_position
.
y
-
element_position
.
y
)
*
(
drone_position
.
y
-
element_position
.
y
);
if
(
distance
<
(
radius
*
radius
))
return
true
;
return
false
;
};
DroneLogAPI
.
prototype
.
_getProbabilityOfDetection
=
function
(
drone_position
)
{
var
h
=
drone_position
.
z
,
km
=
GAMEPARAMETERS
.
meteo
;
prob
=
20
*
(
1
+
(
110
-
h
)
/
25
)
*
km
;
return
prob
;
};
DroneLogAPI
.
prototype
.
isHumanPositionSpottedCalculation
=
function
(
drone
)
{
var
context
=
this
,
result
=
false
,
drone_position
=
drone
.
infosMesh
.
position
;
//swap axes back
drone_position
=
{
x
:
drone_position
.
x
,
y
:
drone_position
.
z
,
z
:
drone_position
.
y
};
context
.
_gameManager
.
teamRight
.
forEach
(
function
(
human
)
{
if
(
human
.
infosMesh
&&
context
.
_isWithinDroneView
(
drone_position
,
human
.
position
))
{
var
prob
=
context
.
_getProbabilityOfDetection
(
drone_position
),
random
=
Math
.
floor
(
Math
.
random
()
*
101
);
if
(
random
<
prob
)
result
=
true
;
}
});
return
result
;
};
DroneLogAPI
.
prototype
.
isHumanPositionSpotted
=
function
(
drone
)
{
var
context
=
this
,
human_detected
;
if
(
drone
.
__is_calculating_human_position
!==
true
)
{
drone
.
__is_calculating_human_position
=
true
;
//human detection is done with the info captured by the drone
//at the moment this method is called
human_detected
=
context
.
isHumanPositionSpottedCalculation
(
drone
);
context
.
_gameManager
.
delay
(
function
()
{
drone
.
__is_calculating_human_position
=
false
;
try
{
drone
.
onCapture
(
human_detected
);
}
catch
(
error
)
{
console
.
warn
(
'
Drone crashed on capture due to error:
'
,
error
);
drone
.
_internal_crash
();
}
},
2000
);
}
};
DroneLogAPI
.
prototype
.
processCoordinates
=
function
(
x
,
y
,
z
)
{
if
(
isNaN
(
x
)
||
isNaN
(
y
)
||
isNaN
(
z
)){
throw
new
Error
(
'
Target coordinates must be numbers
'
);
}
return
{
x
:
x
,
y
:
y
,
z
:
z
};
};
DroneLogAPI
.
prototype
.
getDroneAI
=
function
()
{
return
'
function distance(p1, p2) {
'
+
'
var a = p1[0] - p2[0],
'
+
'
b = p1[1] - p2[1];
'
+
'
return Math.sqrt(a * a + b * b);
'
+
'
}
'
+
'
me.onStart = function() {
'
+
'
console.log("DRONE LOG START!");
'
+
'
if (!me.getFlightParameters())
'
+
'
throw "DroneLog API must implement getFlightParameters";
'
+
'
me.flightParameters = me.getFlightParameters();
'
+
'
me.checkpoint_list = me.flightParameters.converted_log_point_list;
'
+
'
me.startTime = new Date();
'
+
'
me.initTimestamp = me.flightParameters.converted_log_point_list[0][3];
'
+
'
me.setTargetCoordinates(me.checkpoint_list[0][0], me.checkpoint_list[0][1], me.checkpoint_list[0][2]);
'
+
'
me.last_checkpoint_reached = -1;
'
+
'
me.setAcceleration(10);
'
+
'
};
'
+
'
me.onUpdate = function () {
'
+
'
var next_checkpoint = me.checkpoint_list[me.last_checkpoint_reached+1];
'
+
'
if (distance([me.position.x, me.position.y], next_checkpoint) < 12) {
'
+
'
var log_elapsed = next_checkpoint[3] - me.initTimestamp,
'
+
'
time_elapsed = new Date() - me.startTime;
'
+
'
if (time_elapsed < log_elapsed) {
'
+
'
me.setDirection(0, 0, 0);
'
+
'
return;
'
+
'
}
'
+
'
if (me.last_checkpoint_reached + 1 === me.checkpoint_list.length - 1) {
'
+
'
me.setTargetCoordinates(me.position.x, me.position.y, me.position.z);
'
+
'
return;
'
+
'
}
'
+
'
me.last_checkpoint_reached += 1;
'
+
'
next_checkpoint = me.checkpoint_list[me.last_checkpoint_reached+1];
'
+
'
me.setTargetCoordinates(next_checkpoint[0], next_checkpoint[1], next_checkpoint[2]);
'
+
'
} else {
'
+
'
me.setTargetCoordinates(next_checkpoint[0], next_checkpoint[1], next_checkpoint[2]);
'
+
'
}
'
+
'
};
'
;
};
DroneLogAPI
.
prototype
.
setAltitude
=
function
(
altitude
)
{
return
altitude
;
};
DroneLogAPI
.
prototype
.
getMaxSpeed
=
function
()
{
return
3000
;
};
DroneLogAPI
.
prototype
.
getInitialAltitude
=
function
()
{
return
0
;
};
DroneLogAPI
.
prototype
.
getAltitudeAbs
=
function
()
{
return
0
;
};
DroneLogAPI
.
prototype
.
getMinHeight
=
function
()
{
return
0
;
};
DroneLogAPI
.
prototype
.
getMaxHeight
=
function
()
{
return
220
;
};
DroneLogAPI
.
prototype
.
getFlightParameters
=
function
()
{
return
this
.
_flight_parameters
;
};
return
DroneLogAPI
;
}());
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_log_api_js.xml
deleted
100644 → 0
View file @
6a12cc76
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Web Script"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Access_contents_information_Permission
</string>
</key>
<value>
<tuple>
<string>
Anonymous
</string>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Associate
</string>
<string>
Auditor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Add_portal_content_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Change_local_roles_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Modify_portal_content_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_View_Permission
</string>
</key>
<value>
<tuple>
<string>
Anonymous
</string>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Associate
</string>
<string>
Auditor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
content_md5
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
DroneLogAPI.js
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
drone_web_worker_log_api_js
</string>
</value>
</item>
<item>
<key>
<string>
language
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Web Script
</string>
</value>
</item>
<item>
<key>
<string>
short_title
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Drone Log API JS
</string>
</value>
</item>
<item>
<key>
<string>
version
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
document_publication_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
edit_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAQ=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
processing_status_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAU=
</string>
</persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
publish_alive
</string>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1662556208.64
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
validation_state
</string>
</key>
<value>
<string>
published_alive
</string>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"4"
aka=
"AAAAAAAAAAQ="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
edit
</string>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
1003.194.53408.47940
</string>
</value>
</item>
<item>
<key>
<string>
state
</string>
</key>
<value>
<string>
current
</string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1663355083.2
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"5"
aka=
"AAAAAAAAAAU="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
external_processing_state
</string>
</key>
<value>
<string>
empty
</string>
</value>
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
0.0.0.0
</string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1662555993.19
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_map_manager_js.js
deleted
100644 → 0
View file @
6a12cc76
/// <reference path="./typings/babylon.3.1.d.ts" />
var
MapManager
=
/** @class */
(
function
()
{
//*************************************************** CONSTRUCTOR **************************************************
function
MapManager
(
scene
)
{
var
_this
=
this
;
var
max
=
GAMEPARAMETERS
.
mapSize
.
width
;
if
(
GAMEPARAMETERS
.
mapSize
.
depth
>
max
)
max
=
GAMEPARAMETERS
.
mapSize
.
depth
;
if
(
GAMEPARAMETERS
.
mapSize
.
height
>
max
)
max
=
GAMEPARAMETERS
.
mapSize
.
height
;
max
=
max
<
GAMEPARAMETERS
.
mapSize
.
depth
?
GAMEPARAMETERS
.
mapSize
.
depth
:
max
;
// Skybox
var
max_sky
=
(
max
*
10
<
20000
)
?
max
*
10
:
20000
,
skybox
=
BABYLON
.
Mesh
.
CreateBox
(
"
skyBox
"
,
max_sky
,
scene
);
skybox
.
infiniteDistance
=
true
;
skybox
.
renderingGroupId
=
0
;
var
skyboxMat
=
new
BABYLON
.
StandardMaterial
(
"
skybox
"
,
scene
);
skyboxMat
.
backFaceCulling
=
false
;
skyboxMat
.
disableLighting
=
true
;
skyboxMat
.
reflectionTexture
=
new
BABYLON
.
CubeTexture
(
"
./assets/skybox/sky
"
,
scene
);
skyboxMat
.
reflectionTexture
.
coordinatesMode
=
BABYLON
.
Texture
.
SKYBOX_MODE
;
skyboxMat
.
infiniteDistance
=
true
;
skybox
.
material
=
skyboxMat
;
// Plane from bottom
var
largeGroundMat
=
new
BABYLON
.
StandardMaterial
(
"
largeGroundMat
"
,
scene
);
largeGroundMat
.
specularColor
=
BABYLON
.
Color3
.
Black
();
largeGroundMat
.
alpha
=
0.4
;
var
largeGroundBottom
=
BABYLON
.
Mesh
.
CreatePlane
(
"
largeGroundBottom
"
,
max
*
11
,
scene
);
largeGroundBottom
.
position
.
y
=
-
0.01
;
largeGroundBottom
.
rotation
.
x
=
-
Math
.
PI
/
2
;
largeGroundBottom
.
rotation
.
y
=
Math
.
PI
;
largeGroundBottom
.
material
=
largeGroundMat
;
// Camera
scene
.
activeCamera
.
upperRadiusLimit
=
max
*
4
;
// Terrain
var
width
=
GAMEPARAMETERS
.
mapSize
.
width
,
depth
=
GAMEPARAMETERS
.
mapSize
.
depth
,
height
=
GAMEPARAMETERS
.
mapSize
.
height
,
terrain
=
scene
.
getMeshByName
(
"
terrain001
"
);
terrain
.
isVisible
=
true
;
terrain
.
position
=
BABYLON
.
Vector3
.
Zero
();
terrain
.
scaling
=
new
BABYLON
.
Vector3
(
depth
/
50000
,
depth
/
50000
,
width
/
50000
);
// Goals
this
.
_rGoal
=
BABYLON
.
Mesh
.
CreateSphere
(
"
rightGoal
"
,
32
,
GAMEPARAMETERS
.
goalDiameter
,
scene
);
var
rGoalMat
=
new
BABYLON
.
StandardMaterial
(
"
rGoalMat
"
,
scene
);
rGoalMat
.
alpha
=
0.0
;
rGoalMat
.
diffuseColor
=
BABYLON
.
Color3
.
Red
();
this
.
_rGoal
.
material
=
rGoalMat
;
this
.
_rGoal
.
position
=
new
BABYLON
.
Vector3
(
GAMEPARAMETERS
.
goalPositionRightTeam
.
x
,
GAMEPARAMETERS
.
goalPositionRightTeam
.
y
,
GAMEPARAMETERS
.
goalPositionRightTeam
.
z
);
this
.
_rGoal
.
computeWorldMatrix
(
true
);
this
.
_lGoal
=
BABYLON
.
Mesh
.
CreateSphere
(
"
leftGoal
"
,
32
,
GAMEPARAMETERS
.
goalDiameter
,
scene
);
goal_x
=
GAMEPARAMETERS
.
goalPositionLeftTeam
.
x
;
goal_y
=
GAMEPARAMETERS
.
goalPositionLeftTeam
.
y
;
goal_z
=
GAMEPARAMETERS
.
goalPositionLeftTeam
.
z
;
this
.
_lGoal
.
position
=
new
BABYLON
.
Vector3
(
goal_x
,
goal_y
,
goal_z
);
var
lGoalMat
=
new
BABYLON
.
StandardMaterial
(
"
lGoalMat
"
,
scene
);
lGoalMat
.
alpha
=
0.0
;
lGoalMat
.
diffuseColor
=
BABYLON
.
Color3
.
Blue
();
this
.
_lGoal
.
material
=
lGoalMat
;
this
.
_lGoal
.
computeWorldMatrix
(
true
);
//base is now a boat (special object)
/*ObstacleManager.Prefab.rotation = new BABYLON.Vector3(20.4, 0, 0);
ObstacleManager.Prefab.scaling = new BABYLON.Vector3(15, 15, 15);
goalPart1 = new ObstacleManager("goal_1", scene);
goalPart1.setStartingPosition(goal_x, goal_y, goal_z);
goalPart2 = BABYLON.MeshBuilder.CreateBox("goal_2", { 'size': 1 }, scene);
goalPart2.position = new BABYLON.Vector3(goal_x - 0.5, goal_y + 1.5, goal_z + 1.5);
goalPart2.rotation = new BABYLON.Vector3(0, 0, 0);
goalPart2.scaling = new BABYLON.Vector3(2, 2, 1.5);
goalPart3 = BABYLON.MeshBuilder.CreateCylinder("goal_3", {
'diameterBottom': 1.5,
'diameterTop': 1.5,
'height': 1
}, scene);
goalPart3.position = new BABYLON.Vector3(goal_x + 2.5, goal_y + 1.5, goal_z + 1.5);
goalPart3.rotation = new BABYLON.Vector3(0, 0, 0);
goalPart3.scaling = new BABYLON.Vector3(1.5, 3.5, 1.5);*/
// Obstacles
var
count
=
0
;
this
.
_obstacles
=
[];
GAMEPARAMETERS
.
obstacles
.
forEach
(
function
(
obs
)
{
var
newObj
;
switch
(
obs
.
type
)
{
case
"
box
"
:
newObj
=
BABYLON
.
MeshBuilder
.
CreateBox
(
"
obs_
"
+
count
,
{
'
size
'
:
1
},
scene
);
break
;
case
"
cylinder
"
:
newObj
=
BABYLON
.
MeshBuilder
.
CreateCylinder
(
"
obs_
"
+
count
,
{
'
diameterBottom
'
:
obs
.
diameterBottom
,
'
diameterTop
'
:
obs
.
diameterTop
,
'
height
'
:
1
},
scene
);
break
;
case
"
sphere
"
:
newObj
=
BABYLON
.
MeshBuilder
.
CreateSphere
(
"
obs_
"
+
count
,
{
'
diameterX
'
:
obs
.
scale
.
x
,
'
diameterY
'
:
obs
.
scale
.
y
,
'
diameterZ
'
:
obs
.
scale
.
z
},
scene
);
break
;
/*case "boat":
ObstacleManager.Prefab.rotation = new BABYLON.Vector3(obs.rotation.x, obs.rotation.y, obs.rotation.z);
ObstacleManager.Prefab.scaling = new BABYLON.Vector3(obs.scale.x * 2, obs.scale.y * 2, obs.scale.z * 2);
newObj = new ObstacleManager("obs_" + count, scene);
newObj.setStartingPosition(obs.position.x, obs.position.y, obs.position.z);
break;*/
default
:
return
;
}
newObj
[
"
obsType
"
]
=
obs
.
type
;
var
convertion
=
Math
.
PI
/
180
;
if
(
"
position
"
in
obs
)
newObj
.
position
=
new
BABYLON
.
Vector3
(
obs
.
position
.
x
,
obs
.
position
.
y
,
obs
.
position
.
z
);
if
(
"
rotation
"
in
obs
)
newObj
.
rotation
=
new
BABYLON
.
Vector3
(
obs
.
rotation
.
x
*
convertion
,
obs
.
rotation
.
y
*
convertion
,
obs
.
rotation
.
z
*
convertion
);
if
(
"
scale
"
in
obs
)
newObj
.
scaling
=
new
BABYLON
.
Vector3
(
obs
.
scale
.
x
,
obs
.
scale
.
y
,
obs
.
scale
.
z
);
if
(
"
color
"
in
obs
)
{
var
material
=
new
BABYLON
.
StandardMaterial
(
scene
);
material
.
alpha
=
1
;
material
.
diffuseColor
=
new
BABYLON
.
Color3
(
obs
.
color
.
r
,
obs
.
color
.
g
,
obs
.
color
.
b
);
newObj
.
material
=
material
;
}
_this
.
_obstacles
.
push
(
newObj
);
});
}
Object
.
defineProperty
(
MapManager
.
prototype
,
"
lGoal
"
,
{
get
:
function
()
{
return
this
.
_lGoal
;
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
MapManager
.
prototype
,
"
rGoal
"
,
{
get
:
function
()
{
return
this
.
_rGoal
;
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
MapManager
.
prototype
,
"
obstacles
"
,
{
get
:
function
()
{
return
this
.
_obstacles
;
},
enumerable
:
true
,
configurable
:
true
});
return
MapManager
;
}());
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_map_manager_js.xml
deleted
100644 → 0
View file @
6a12cc76
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Web Script"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Access_contents_information_Permission
</string>
</key>
<value>
<tuple>
<string>
Anonymous
</string>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Associate
</string>
<string>
Auditor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Add_portal_content_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Change_local_roles_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Modify_portal_content_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_View_Permission
</string>
</key>
<value>
<tuple>
<string>
Anonymous
</string>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Associate
</string>
<string>
Auditor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
content_md5
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
MapManager.js
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
drone_web_worker_map_manager_js
</string>
</value>
</item>
<item>
<key>
<string>
language
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Web Script
</string>
</value>
</item>
<item>
<key>
<string>
short_title
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Map Manager JS
</string>
</value>
</item>
<item>
<key>
<string>
version
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
document_publication_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
edit_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAQ=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
processing_status_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAU=
</string>
</persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
publish_alive
</string>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1662556210.78
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
validation_state
</string>
</key>
<value>
<string>
published_alive
</string>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"4"
aka=
"AAAAAAAAAAQ="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
edit
</string>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
1002.59720.6150.16674
</string>
</value>
</item>
<item>
<key>
<string>
state
</string>
</key>
<value>
<string>
current
</string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1664385627.49
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"5"
aka=
"AAAAAAAAAAU="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
external_processing_state
</string>
</key>
<value>
<string>
empty
</string>
</value>
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
0.0.0.0
</string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1662555978.78
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_obstacle_manager_js.js
deleted
100644 → 0
View file @
6a12cc76
/// <reference path="./typings/babylon.3.1.d.ts" />
var
ObstacleManager
=
/** @class */
(
function
()
{
//*************************************************** CONSTRUCTOR **************************************************
function
ObstacleManager
(
id
,
scene
)
{
// Mesh
this
.
_mesh
=
null
;
this
.
_controlMesh
=
null
;
this
.
_colliderBackMesh
=
null
;
this
.
_maxOrientation
=
Math
.
PI
/
4
;
this
.
_scene
=
scene
;
this
.
_id
=
id
;
// Create the control mesh
this
.
_controlMesh
=
BABYLON
.
Mesh
.
CreateBox
(
"
obstacleControl_
"
+
id
,
0.01
,
this
.
_scene
);
this
.
_controlMesh
.
isVisible
=
false
;
this
.
_controlMesh
.
rotation
=
new
BABYLON
.
Vector3
(
0
,
Math
.
PI
,
0
);
this
.
_controlMesh
.
computeWorldMatrix
(
true
);
// Create the mesh from the obstacle prefab
console
.
log
(
"
ObstacleManager.Prefab:
"
,
ObstacleManager
.
Prefab
);
this
.
_mesh
=
ObstacleManager
.
Prefab
.
clone
(
"
obstacle_
"
+
id
,
this
.
_controlMesh
);
this
.
_mesh
.
position
=
BABYLON
.
Vector3
.
Zero
();
this
.
_mesh
.
isVisible
=
true
;
this
.
_mesh
.
computeWorldMatrix
(
true
);
this
.
_propellerAnimMeshes
=
[];
}
// API
ObstacleManager
.
prototype
.
_swapAxe
=
function
(
vector
)
{
return
new
BABYLON
.
Vector3
(
vector
.
x
,
vector
.
z
,
vector
.
y
);
};
Object
.
defineProperty
(
ObstacleManager
.
prototype
,
"
colliderMesh
"
,
{
//*************************************************** ACCESSOR *****************************************************
get
:
function
()
{
return
this
.
_mesh
;
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
ObstacleManager
.
prototype
,
"
colliderBackMesh
"
,
{
get
:
function
()
{
return
this
.
_colliderBackMesh
;
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
ObstacleManager
.
prototype
,
"
infosMesh
"
,
{
get
:
function
()
{
return
this
.
_controlMesh
;
},
enumerable
:
true
,
configurable
:
true
});
Object
.
defineProperty
(
ObstacleManager
.
prototype
,
"
position
"
,
{
get
:
function
()
{
if
(
this
.
_controlMesh
!==
null
)
{
return
this
.
_swapAxe
(
this
.
_controlMesh
.
position
);
}
return
null
;
},
enumerable
:
true
,
configurable
:
true
});
//*************************************************** FUNCTIONS ****************************************************
// -- Starting info
/**
* Set the starting position of the obstacle
* Take x,y,z coordinates as parameters
*/
ObstacleManager
.
prototype
.
setStartingPosition
=
function
(
x
,
y
,
z
)
{
this
.
_controlMesh
.
position
=
new
BABYLON
.
Vector3
(
x
,
y
,
z
);
this
.
_controlMesh
.
computeWorldMatrix
(
true
);
this
.
_mesh
.
computeWorldMatrix
(
true
);
};
return
ObstacleManager
;
}());
erp5_drone_simulator/PathTemplateItem/web_page_module/drone_web_worker_obstacle_manager_js.xml
deleted
100644 → 0
View file @
6a12cc76
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Web Script"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Access_contents_information_Permission
</string>
</key>
<value>
<tuple>
<string>
Anonymous
</string>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Associate
</string>
<string>
Auditor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Add_portal_content_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Change_local_roles_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_Modify_portal_content_Permission
</string>
</key>
<value>
<tuple>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
_View_Permission
</string>
</key>
<value>
<tuple>
<string>
Anonymous
</string>
<string>
Assignee
</string>
<string>
Assignor
</string>
<string>
Associate
</string>
<string>
Auditor
</string>
<string>
Manager
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
content_md5
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
default_reference
</string>
</key>
<value>
<string>
ObstacleManager.js
</string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
drone_web_worker_obstacle_manager_js
</string>
</value>
</item>
<item>
<key>
<string>
language
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Web Script
</string>
</value>
</item>
<item>
<key>
<string>
short_title
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Obstacle Manager JS
</string>
</value>
</item>
<item>
<key>
<string>
version
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
workflow_history
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"PersistentMapping"
module=
"Persistence.mapping"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
data
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
document_publication_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAM=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
edit_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAQ=
</string>
</persistent>
</value>
</item>
<item>
<key>
<string>
processing_status_workflow
</string>
</key>
<value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAU=
</string>
</persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"3"
aka=
"AAAAAAAAAAM="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
publish_alive
</string>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1662651834.74
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key>
<string>
validation_state
</string>
</key>
<value>
<string>
published_alive
</string>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"4"
aka=
"AAAAAAAAAAQ="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
edit
</string>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
1002.54032.1793.9847
</string>
</value>
</item>
<item>
<key>
<string>
state
</string>
</key>
<value>
<string>
current
</string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1662657167.12
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
<record
id=
"5"
aka=
"AAAAAAAAAAU="
>
<pickle>
<global
name=
"WorkflowHistoryList"
module=
"Products.ERP5Type.Workflow"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_log
</string>
</key>
<value>
<list>
<dictionary>
<item>
<key>
<string>
action
</string>
</key>
<value>
<string>
detect_converted_file
</string>
</value>
</item>
<item>
<key>
<string>
actor
</string>
</key>
<value>
<string>
zope
</string>
</value>
</item>
<item>
<key>
<string>
comment
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
error_message
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
external_processing_state
</string>
</key>
<value>
<string>
converted
</string>
</value>
</item>
<item>
<key>
<string>
serial
</string>
</key>
<value>
<string>
0.0.0.0
</string>
</value>
</item>
<item>
<key>
<string>
time
</string>
</key>
<value>
<object>
<klass>
<global
name=
"DateTime"
module=
"DateTime.DateTime"
/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>
1662651770.1
</float>
<string>
UTC
</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment