|
|
|
export default { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addEnv(state, payload){ |
|
if(payload.set == 'base'){ |
|
state.envsSets.baseEnvsSet.push(payload.env); |
|
} |
|
else if(payload.set == 'custom'){ |
|
state.envsSets.customEnvsSet.push(payload.env); |
|
} |
|
|
|
|
|
state.envsSets.baseEnvsSet.sort(function(a, b){ |
|
|
|
|
|
if(a.description["EN"].name.split(" ")[0] == "Flat"){ |
|
return -1; |
|
} |
|
else if(b.description["EN"].name.split(" ")[0] == "Flat"){ |
|
return 1; |
|
} |
|
else{ |
|
return a.description["EN"].name.localeCompare(b.description["EN"].name); |
|
} |
|
}); |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
deleteEnv(state, payload){ |
|
state.envsSets.customEnvsSet.splice(payload, 1); |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
updateParkourConfig(state, payload){ |
|
switch (payload.name) { |
|
case 'dim1': |
|
state.parkourConfig.terrain.dim1 = payload.value; |
|
break; |
|
case 'dim2': |
|
state.parkourConfig.terrain.dim2 = payload.value; |
|
break; |
|
case 'dim3': |
|
state.parkourConfig.terrain.dim3 = payload.value; |
|
break; |
|
case 'smoothing': |
|
state.parkourConfig.terrain.smoothing = payload.value; |
|
break; |
|
case 'waterLevel': |
|
state.parkourConfig.terrain.waterLevel = payload.value; |
|
break; |
|
case 'width': |
|
state.parkourConfig.creepers.width = payload.value; |
|
break; |
|
case 'height': |
|
state.parkourConfig.creepers.height = payload.value; |
|
break; |
|
case 'spacing': |
|
state.parkourConfig.creepers.spacing = payload.value; |
|
break; |
|
case 'type': |
|
state.parkourConfig.creepers.type = payload.value; |
|
break; |
|
} |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
init_default(state, payload){ |
|
state.simulationState.status = 'init'; |
|
|
|
if(window.game != null){ |
|
window.align_terrain = { |
|
align: false, |
|
ceiling_offset: window.ceiling.length > 0 ? window.game.env.ceiling_offset - window.ceiling[0].y : null, |
|
ground_offset: window.ground.length > 0 ? window.ground[0].y : null, |
|
smoothing: window.game.env.TERRAIN_CPPN_SCALE |
|
}; |
|
} |
|
|
|
let terrainConfig = state.parkourConfig.terrain; |
|
let creepersConfig = state.parkourConfig.creepers; |
|
init_game( |
|
[terrainConfig.dim1, terrainConfig.dim2, terrainConfig.dim3], |
|
terrainConfig.waterLevel, |
|
creepersConfig.width, |
|
creepersConfig.height, |
|
creepersConfig.spacing, |
|
terrainConfig.smoothing, |
|
creepersConfig.type == 'Swingable', |
|
window.ground, |
|
window.ceiling, |
|
window.align_terrain |
|
); |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
startSimulation(state, payload) { |
|
state.simulationState.status = 'running'; |
|
window.game.run(); |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pauseSimulation(state, payload) { |
|
window.game.pause(); |
|
state.simulationState.status = 'paused'; |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
resetSimulation(state, payload) { |
|
state.simulationState.status = 'init'; |
|
|
|
|
|
const agents = { |
|
morphologies: state.agents.map(a => a.morphology), |
|
policies: state.agents.map(a => { |
|
return { |
|
name: a.name, |
|
path: a.path |
|
}; |
|
}), |
|
positions: [] |
|
} |
|
|
|
if (payload.keepPositions) { |
|
agents.positions = [...state.agents.map((agent, index) => window.game.env.agents[index].agent_body.reference_head_object.GetPosition())]; |
|
} |
|
|
|
else { |
|
agents.positions = [...state.agents.map((agent, index) => window.game.env.agents[index].init_pos)]; |
|
} |
|
|
|
const terrainConfig = state.parkourConfig.terrain; |
|
const creepersConfig = state.parkourConfig.creepers; |
|
|
|
|
|
window.align_terrain = { |
|
align: true, |
|
ceiling_offset: window.align_terrain.ceiling_offset, |
|
ground_offset: window.align_terrain.ground_offset, |
|
smoothing: window.game.env.TERRAIN_CPPN_SCALE |
|
}; |
|
|
|
|
|
window.game.reset( |
|
agents, |
|
[terrainConfig.dim1,terrainConfig.dim2,terrainConfig.dim3], |
|
terrainConfig.waterLevel, |
|
creepersConfig.width, |
|
creepersConfig.height, |
|
creepersConfig.spacing, |
|
terrainConfig.smoothing, |
|
creepersConfig.type == "Swingable", |
|
window.ground, |
|
window.ceiling, |
|
window.align_terrain); |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addAgent(state, payload) { |
|
state.agents.push(payload); |
|
if(window.game != null){ |
|
window.game.env.add_agent(payload.morphology, {name: payload.name, path: payload.path}, payload.init_pos); |
|
window.game.env.render(); |
|
} |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
deleteAgent(state, payload) { |
|
state.agents.splice(payload.index, 1); |
|
if(window.game != null){ |
|
window.game.env.delete_agent(payload.index); |
|
window.game.env.render(); |
|
} |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setAgentInitPos(state, payload){ |
|
window.game.env.agents[payload.index].init_pos = payload.init_pos; |
|
state.agents[payload.index].init_pos = payload.init_pos; |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
selectAgent(state, payload) { |
|
if(payload.index != -1){ |
|
window.agent_selected = window.game.env.agents[payload.index]; |
|
state.simulationState.agentSelected = state.agents[payload.index]; |
|
} |
|
|
|
else{ |
|
window.agent_selected = null; |
|
state.simulationState.agentSelected = null; |
|
} |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
followAgent(state, payload) { |
|
if(payload.index != -1){ |
|
window.agent_followed = window.game.env.agents[payload.index]; |
|
state.simulationState.agentFollowed = state.agents[payload.index]; |
|
} |
|
|
|
else { |
|
window.agent_followed = null; |
|
state.simulationState.agentFollowed = null; |
|
} |
|
window.game.env.render(); |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
renameAgent(state, payload) { |
|
state.agents[payload.index].name = payload.value; |
|
window.game.env.agents[payload.index].name = payload.value; |
|
window.game.env.render(); |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
selectSeedIdx(state, payload) { |
|
state.currentSeedsIdx[payload.morphology] = payload.index; |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addMorphology(state, payload) { |
|
state.morphologies.push(payload); |
|
|
|
state.morphologies.sort(function(a, b){ |
|
return a.morphology.localeCompare(b.morphology); |
|
}); |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switchTab(state, payload) { |
|
state.activeTab = payload; |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
drawGround(state, payload){ |
|
state.drawingModeState.drawing_ground = payload; |
|
state.drawingModeState.drawing_ceiling = false; |
|
state.drawingModeState.erasing = false; |
|
state.advancedOptionsState.assets.circle = false; |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
drawCeiling(state, payload){ |
|
state.drawingModeState.drawing_ground = false; |
|
state.drawingModeState.drawing_ceiling = payload; |
|
state.drawingModeState.erasing = false; |
|
state.advancedOptionsState.assets.circle = false; |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
erase(state, payload){ |
|
state.drawingModeState.drawing_ground = false; |
|
state.drawingModeState.drawing_ceiling = false; |
|
state.drawingModeState.erasing = payload; |
|
state.advancedOptionsState.assets.circle = false; |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
drawCircle(state, payload){ |
|
state.drawingModeState.drawing_ground = false; |
|
state.drawingModeState.drawing_ceiling = false; |
|
state.drawingModeState.erasing = false; |
|
state.advancedOptionsState.assets.circle = payload; |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
deselectDrawingButtons(state, payload){ |
|
state.drawingModeState.drawing_ground = false; |
|
state.drawingModeState.drawing_ceiling = false; |
|
state.drawingModeState.erasing = false; |
|
state.advancedOptionsState.assets.circle = false; |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
clear(state, payload){ |
|
|
|
drawing_canvas.clear(); |
|
window.ground = []; |
|
window.ceiling = []; |
|
window.terrain = { |
|
ground: [], |
|
ceiling: [] |
|
}; |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
generateTerrain(state, payload){ |
|
|
|
state.drawingModeState.drawing = !payload; |
|
state.simulationState.status = 'init'; |
|
|
|
|
|
if(payload) { |
|
|
|
|
|
window.terrain.ground.sort(function (a, b) { |
|
return a.x - b.x; |
|
}); |
|
window.ground = [...window.terrain.ground]; |
|
|
|
|
|
window.terrain.ceiling.sort(function (a, b) { |
|
return a.x - b.x; |
|
}); |
|
window.ceiling = [...window.terrain.ceiling]; |
|
|
|
|
|
window.align_terrain = { |
|
align: false, |
|
ceiling_offset: window.ceiling.length > 0 ? window.game.env.ceiling_offset - window.ceiling[0].y : null, |
|
ground_offset: window.ground.length > 0 ? window.ground[0].y : null, |
|
smoothing: window.game.env.TERRAIN_CPPN_SCALE |
|
}; |
|
|
|
let terrainConfig = state.parkourConfig.terrain; |
|
let creepersConfig = state.parkourConfig.creepers; |
|
init_game( |
|
[terrainConfig.dim1, terrainConfig.dim2, terrainConfig.dim3], |
|
terrainConfig.waterLevel, |
|
creepersConfig.width, |
|
creepersConfig.height, |
|
creepersConfig.spacing, |
|
terrainConfig.smoothing, |
|
creepersConfig.type == 'Swingable', |
|
window.ground, |
|
window.ceiling, |
|
window.align_terrain, |
|
window.game.env.zoom, |
|
window.game.env.scroll |
|
); |
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
window.draw_forbidden_area(); |
|
|
|
|
|
drawing_canvas.clear(); |
|
window.terrain = { |
|
ground: [], |
|
ceiling: [] |
|
}; |
|
|
|
|
|
if(window.ground.length > 0){ |
|
|
|
for(let i = 0; i < window.ground.length - 1; i++){ |
|
let p = window.ground[i]; |
|
let p2 = window.ground[i + 1]; |
|
let p_pos = convertPosEnvToCanvas(p.x, p.y); |
|
let p2_pos = convertPosEnvToCanvas(p2.x, p2.y); |
|
|
|
drawing_canvas.stroke("#66994D"); |
|
drawing_canvas.strokeWeight(4); |
|
drawing_canvas.line( |
|
p_pos.x, |
|
p_pos.y + SCROLL_Y_MAX - window.game.env.scroll[1], |
|
p2_pos.x, |
|
p2_pos.y + SCROLL_Y_MAX - window.game.env.scroll[1] |
|
) |
|
|
|
window.terrain.ground.push({x: p.x, y: p.y}); |
|
} |
|
let p = window.ground[window.ground.length - 1]; |
|
window.terrain.ground.push({x: p.x, y: p.y}); |
|
} |
|
|
|
|
|
if(window.ceiling.length > 0){ |
|
|
|
for(let i = 0; i < window.ceiling.length - 1; i++){ |
|
let p = window.ceiling[i]; |
|
let p2 = window.ceiling[i + 1]; |
|
let p_pos = convertPosEnvToCanvas(p.x, p.y); |
|
let p2_pos = convertPosEnvToCanvas(p2.x, p2.y); |
|
|
|
drawing_canvas.stroke("#808080"); |
|
drawing_canvas.strokeWeight(4); |
|
drawing_canvas.line( |
|
p_pos.x, |
|
p_pos.y + SCROLL_Y_MAX - window.game.env.scroll[1], |
|
p2_pos.x, |
|
p2_pos.y + SCROLL_Y_MAX - window.game.env.scroll[1] |
|
) |
|
|
|
window.terrain.ceiling.push({x: p.x, y: p.y}); |
|
} |
|
let p = window.ceiling[window.ceiling.length - 1]; |
|
window.terrain.ceiling.push({x: p.x, y: p.y}); |
|
} |
|
|
|
|
|
window.ground = []; |
|
window.ceiling = []; |
|
|
|
|
|
let terrainConfig = state.parkourConfig.terrain; |
|
let creepersConfig = state.parkourConfig.creepers; |
|
init_game( |
|
[terrainConfig.dim1, terrainConfig.dim2, terrainConfig.dim3], |
|
terrainConfig.waterLevel, |
|
creepersConfig.width, |
|
creepersConfig.height, |
|
creepersConfig.spacing, |
|
terrainConfig.smoothing, |
|
creepersConfig.type == 'Swingable', |
|
window.ground, |
|
window.ceiling, |
|
window.align_terrain, |
|
window.game.env.zoom, |
|
window.game.env.scroll |
|
); |
|
|
|
|
|
image(drawing_canvas, 0, -SCROLL_Y_MAX + window.game.env.scroll[1]); |
|
image(forbidden_canvas, 0, -SCROLL_Y_MAX + window.game.env.scroll[1]); |
|
} |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
refreshDrawing(state, payload){ |
|
|
|
|
|
window.draw_forbidden_area(); |
|
|
|
drawing_canvas.clear(); |
|
|
|
|
|
window.terrain.ground.sort(function (a, b) { |
|
return a.x - b.x; |
|
}); |
|
|
|
|
|
window.terrain.ceiling.sort(function (a, b) { |
|
return a.x - b.x; |
|
}); |
|
|
|
|
|
for(let i = 0; i < window.terrain.ground.length - 1; i++) { |
|
let p = window.terrain.ground[i]; |
|
let p2 = window.terrain.ground[i + 1]; |
|
let p_pos = convertPosEnvToCanvas(p.x, p.y); |
|
let p2_pos = convertPosEnvToCanvas(p2.x, p2.y); |
|
|
|
drawing_canvas.stroke("#66994D"); |
|
drawing_canvas.strokeWeight(4); |
|
drawing_canvas.line( |
|
p_pos.x, |
|
p_pos.y + SCROLL_Y_MAX - window.game.env.scroll[1], |
|
p2_pos.x, |
|
p2_pos.y + SCROLL_Y_MAX - window.game.env.scroll[1] |
|
) |
|
} |
|
|
|
|
|
for(let i = 0; i < window.terrain.ceiling.length - 1; i++) { |
|
let p = window.terrain.ceiling[i]; |
|
let p2 = window.terrain.ceiling[i + 1]; |
|
let p_pos = convertPosEnvToCanvas(p.x, p.y); |
|
let p2_pos = convertPosEnvToCanvas(p2.x, p2.y); |
|
|
|
drawing_canvas.stroke("#808080"); |
|
drawing_canvas.strokeWeight(4); |
|
drawing_canvas.line( |
|
p_pos.x, |
|
p_pos.y + SCROLL_Y_MAX - window.game.env.scroll[1], |
|
p2_pos.x, |
|
p2_pos.y + SCROLL_Y_MAX - window.game.env.scroll[1] |
|
) |
|
} |
|
|
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
drawJoints(state, payload) { |
|
state.advancedOptionsState.drawJoints = payload; |
|
window.draw_joints = payload; |
|
window.game.env.render(); |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
drawLidars(state, payload) { |
|
state.advancedOptionsState.drawLidars = payload; |
|
window.draw_lidars = payload; |
|
window.game.env.render(); |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
drawNames(state, payload) { |
|
state.advancedOptionsState.drawNames = payload; |
|
window.draw_names = payload; |
|
window.game.env.render(); |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
drawObservation(state, payload) { |
|
state.advancedOptionsState.drawObservation = payload; |
|
window.draw_observation = payload; |
|
window.game.env.render(); |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
drawReward(state, payload) { |
|
state.advancedOptionsState.drawReward = payload; |
|
window.draw_reward = payload; |
|
window.game.env.render(); |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setIntroTour(state, payload){ |
|
state.simulationState.intro_tour = payload; |
|
|
|
|
|
if(!payload){ |
|
window.introTour.addHints(); |
|
} |
|
return state; |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setLanguage(state, payload) { |
|
state.language = payload; |
|
return state; |
|
} |
|
}; |