|
Iso/iec jtc 1/sc 29 N
ARAF supports compressed media representation as specified by the following set of MPEG/JPEG standards:
Media Type
|
Compression tool name
|
Reference standard
|
Image
|
JPEG
|
ISO/IEC 10918
|
JPEG2000
|
ISO/IEC 15444
|
Video
|
Visual
|
ISO/IEC 14496-2
|
Advanced Video Coding
|
ISO/IEC 14496-10
|
Audio
|
MP3
|
ISO/IEC-11172-3
|
Advanced Audio Coding
|
ISO/IEC 14496-3
|
3D Graphics
|
Scalable Complexity Mesh Coding
|
ISO/IEC 14496-16
|
Bone-based Animation
|
ISO/IEC 14496-16
|
Scenes
|
BIFS
|
ISO/IEC 14496-11
|
(informative)
100
Map related Prototypes Implementation
PROTO MapMarker [
exposedField SFString name ""
exposedField SFVec3f position 0 0 0
exposedField SFBool clickable TRUE
exposedField SFBool visible TRUE
exposedField SFBool enabled TRUE
exposedField MFNode markerShape []
eventIn SFBool doClick
eventIn SFVec2f setPlayerGPS
eventIn SFVec2f setMapGPSCenter
eventIn SFInt32 setMapZoomLevel
eventOut SFBool onClick
eventOut SFString onPlayerAround
eventOut SFString onPlayerLeft
]
{
DEF MARKER_SW Switch {
whichChoice 0
choice [
Transform2D {
children [
DEF TS TouchSensor {}
DEF MARKER_NODE Transform2D {
translation 0 0
children IS markerShape
}
]
}
]
}
DEF UI_MARKER_SCRIPT Script {
field SFNode script USE UI_MARKER_SCRIPT
field SFNode main_sw USE MARKER_SW
field SFNode markerNode USE MARKER_NODE
field SFNode ts USE TS
eventIn SFString setName IS name
eventIn SFVec3f setPosition IS position
eventIn SFBool setVisible IS visible
eventIn SFBool setClickable IS clickable
eventIn SFBool setEnable IS enabled
eventIn MFNode setMarkerShape IS markerShape
eventIn SFInt32 updateZoomLevel IS setMapZoomLevel
eventIn SFVec2f updateMapGPSCenter IS setMapGPSCenter
eventIn SFVec2f updatePlayerGPS IS setPlayerGPS
eventIn SFBool fakeClick IS doClick
eventIn SFBool clicked
eventOut SFBool onClick IS onClick
eventOut SFString playerAround IS onPlayerAround
eventOut SFString playerLeft IS onPlayerLeft
url ["
javascript:
function initialize() {
# Equatorial radius (m)
eqRadius = 6378137;
tileSize = 256;
playerAround = false;
originShift = 2 * Math.PI * eqRadius / 2.0;
initialResolution = 2 * Math.PI * eqRadius / tileSize;
mapGPSCenter = new SFVec2f ();
mapZoomLevel = 0;
isEnabled = false;
isClickable = false;
isVisible = false;
markerName = 'm_'+Math.random().toString(36).substr(2, 5);
markerPos = new SFVec3f ();
}
function fakeClick(val) {
clicked(val);
}
function setMarkerPositionOnMap() {
if (!mapGPSCenter) return;
markerCoord = LatLonToPixels(markerPos[0], markerPos[1]);
mapCenterCoord = LatLonToPixels(mapGPSCenter[0], mapGPSCenter[1]);
markerNode.translation[0] = markerCoord[0] - mapCenterCoord[0];
markerNode.translation[1] = markerCoord[1] - mapCenterCoord[1];
print ('[ MARKER ] - ' + markerName + ': UPDATE POSITION ON MAP : ' + markerNode.translation);
}
function setName(name) {
if (name == '') return;
print ('[---------------------------------------------------------]');
print ('[ MARKER ] - ' + markerName + ': UPDATE NAME to ' + name);
markerName = name;
}
function clicked(val) {
if (!val) return;
print ('[ MARKER ] - ' + markerName + ': CLICKED!');
onClick = true;
}
function setEnable(val) {
isEnabled = val;
if (val) {
print ('[ MARKER ] - ' + markerName + ': SET ENABLED');
}
else {
print ('[ MARKER ] - ' + markerName + ': SET DISABLED');
}
}
function setClickable(val) {
ts.enabled = val;
isClickable = val;
if (val) {
print ('[ MARKER ] - ' + markerName + ': SET CLICKABLE');
}
else {
print ('[ MARKER ] - ' + markerName + ': SET UNCLICKABLE');
}
}
function setPosition(gpsPos) {
if ( (gpsPos.x == 0) && (gpsPos.y == 0) && (gpsPos.z == 0) ) {
return;
}
print ('[ MARKER ] - ' + markerName + ': SET POSITION: ' + gpsPos);
markerPos = gpsPos;
setMarkerPositionOnMap();
}
function setMarkerShape(markerShape) {
if (typeof(markerShape) == 'undefined') return;
if (markerShape.length == 0) {
print ('[ MARKER ] - ' + markerName + ': markerShape is empty!');
print ('[ MARKER ] - ' + markerName + ': Returning...');
return;
}
print ('[ MARKER ] - ' + markerName + ': SET NEW MARKER SHAPE');
}
function setVisible(val) {
if (val) {
main_sw.whichChoice = 0;
print ('[ MARKER ] - ' + markerName + ': SET VISIBLE');
}
else {
main_sw.whichChoice = -1;
print ('[ MARKER ] - ' + markerName + ': SET INVISIBLE');
}
isVisible = val;
}
function updatePlayerGPS(playerPos) {
if (playerPos.x == 0 || playerPos.y == 0) return;
distance = haversine_km(markerPos[0], markerPos[1], playerPos[0], playerPos[1]);
# to meters
distance *= 1000;
print ('[ MARKER ] - ' + markerName + ': DISTANCE TO PLAYER = ' + distance + '. Limit to reach: ' + markerPos[2]);
if (!playerAround && (distance <= markerPos[2]) && isEnabled) {
print ('[ MARKER ] - ' + markerName + ': Player around!');
playerAround = markerName;
}
else if (playerAround && (distance > markerPos[2]) && isEnabled) {
print ('[ MARKER ] - ' + markerName + ': Player left!');
playerLeft = markerName;
playerAround = false;
}
}
function updateZoomLevel(zoomLevel) {
if (zoomLevel <= 0) return;
print ('[ MARKER ] - ' + markerName + ': MAP ZOOM LEVEL: ' + zoomLevel);
mapZoomLevel = zoomLevel;
setMarkerPositionOnMap();
}
function updateMapGPSCenter(gpsCenter) {
if (gpsCenter[0] == 0.0 && gpsCenter[1] == 0.0) return;
print ('[ MARKER ] - ' + markerName + ': Update MAP GPS CENTER: ' + gpsCenter);
mapGPSCenter = gpsCenter;
setMarkerPositionOnMap();
}
# START COMP_FUNCTIONS
# The following functions are used to compute distances between 2 GPS positions
# and converting GPS position to coordinates and vice-versa.
# These should not be changed
# Calculates distance between 2 points (lat1, long1) & (lat2, long2)
# http://en.wikipedia.org/wiki/Haversine_formula
# http://stackoverflow.com/questions/365826/calculate-distance-between-2-gps-coordinates
#
function haversine_km(lat1, long1, lat2, long2) {
d2r = Math.PI / 180;
d_latt = (lat2 - lat1) * d2r;
d_long = (long2 - long1) * d2r;
a = Math.sin(d_latt/2)*Math.sin(d_latt/2) + Math.cos(lat1 * d2r) * Math.cos(lat2 * d2r) * Math.sin(d_long/2)*Math.sin(d_long/2);
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
return 6371 * c;
}
function LatLonToMeters(lat, lon ) {
mx = lon * originShift / 180.0;
my = Math.log( Math.tan((90 + lat) * Math.PI / 360.0 )) / (Math.PI / 180.0);
my = my * originShift / 180.0;
return new Array(mx, my);
}
function LatLonToPixels(lat, lon) {
ll2p = LatLonToMeters(lat, lon);
m2p = MetersToPixels(ll2p[0], ll2p[1], mapZoomLevel);
return new Array(m2p[0], m2p[1]);
}
function MetersToPixels(mx, my) {
res = Resolution();
px = (mx + originShift) / res;
py = (my + originShift) / res;
return new Array(px, py);
}
function Resolution() {
return initialResolution / (Math.pow(2,mapZoomLevel));
}
# END COMP_FUNCTIONS
"]
}
ROUTE TS.isActive TO UI_MARKER_SCRIPT.clicked
}
PROTO MapOverlay [
exposedField SFString name ""
exposedField SFBool visible TRUE
exposedField SFBool enabled TRUE
exposedField SFBool clickable TRUE
exposedField MFNode children []
exposedField MFString keywords []
eventIn MFNode addOverlayItems
eventIn MFNode removeOverlayItems
]
{
DEF MapOverlaySW Switch {
whichChoice 0
choice [
DEF MapOverlayOG OrderedGroup {
children IS children
}
]
}
DEF UI_MapOverlay_SCRIPT Script {
field SFNode og USE MapOverlayOG
field SFNode sw USE MapOverlaySW
eventIn SFString setOverlayName IS name
eventIn SFBool setVisible IS visible
eventIn SFBool setClickable IS clickable
eventIn SFBool setEnable IS enabled
eventIn MFNode addOverlayItems IS addOverlayItems
eventIn MFNode removeOverlayItems IS removeOverlayItems
url ["
javascript:
function initialize() {
mapOverlayName = 'mo_'+Math.random().toString(36).substr(2, 5);
}
function setOverlayName(name) {
if (name == '') return;
print ('[ MapOverlay ] - ' + mapOverlayName + ': UPDATE NAME to ' + name);
mapOverlayName = name;
}
function setEnable(val) {
if (val) {
for (i = 0; i < og.children.length; i++) {
og.children[i].enabled = true;
}
print ('[ MapOverlay ] - ' + mapOverlayName + ': SET ENABLE ');
}
else {
for (i = 0; i < og.children.length; i++) {
og.children[i].enabled = false;
}
print ('[ MapOverlay ] - ' + mapOverlayName + ': SET DISABLE ');
}
isEnabled = val;
}
function setVisible(val) {
if (val) {
print ('[ MapOverlay ] - ' + mapOverlayName + ': SET VISIBLE');
# sw.whichChoice = 0;
for (i = 0; i < og.children.length; i++) {
og.children[i].visible = true;
}
}
else {
print ('[ MapOverlay ] - ' + mapOverlayName + ': SET INVISIBLE');
# sw.whichChoice = -1;
for (i = 0; i < og.children.length; i++) {
og.children[i].visible = false;
}
}
isVisible = val;
}
function setClickable(val) {
if (val) {
for (i = 0; i < og.children.length; i++) {
og.children[i].clickable = true;
}
enabled = true;
print ('[ MapOverlay ] - ' + mapOverlayName + ': SET CLICKABLE');
}
else {
for (i = 0; i < og.children.length; i++) {
og.children[i].clickable = false;
}
enabled = false;
print ('[ MapOverlay ] - ' + mapOverlayName + ': SET UNCLICKABLE');
}
isClickable = val;
}
function addOverlayItems(marker) {
if (marker == null) return;
if (marker.length == 0) return;
og.addChildren = new MFNode(marker[0]);
print ('[ MapOverlay ] - ' + mapOverlayName + ': ADD new overlay item \\"' + marker[0].name + '\\"');
}
function removeOverlayItems(marker) {
if (marker == null) return;
if (marker.length == 0) return;
for (i = 0; i < og.children.length; i++) {
if (og.children[i].name == marker.name) {
og.removeChildren = new MFNode(og.children[i]);
print ('[ MapOverlay ] - ' + mapOverlayName + ': REMOVE overlay item \\"' + marker.name + '\\"');
return;
}
}
print ('[ MapOverlay ] - ' + mapOverlayName + ': COULD NOT FIND Overlay item \\"' + marker.name + '\\"!');
}
"]
}
}
Dostları ilə paylaş: |
|
|