|
|
@@ -44,6 +44,7 @@ namespace Crown
|
|
|
_selection = new Gee.ArrayList<Guid?>();
|
|
|
}
|
|
|
|
|
|
+ /// Resets the level
|
|
|
public void reset()
|
|
|
{
|
|
|
_db.reset();
|
|
|
@@ -56,26 +57,318 @@ namespace Crown
|
|
|
_client.send_script(LevelEditorApi.reset());
|
|
|
}
|
|
|
|
|
|
- public void new_level()
|
|
|
- {
|
|
|
- load(_toolchain_dir + "core/editors/levels/empty.level");
|
|
|
- }
|
|
|
-
|
|
|
+ /// Loads the level from @a path.
|
|
|
public void load(string path)
|
|
|
{
|
|
|
reset();
|
|
|
_db.load(path);
|
|
|
+ send_level();
|
|
|
}
|
|
|
|
|
|
+ /// Saves the level to @a path.
|
|
|
public void save(string path)
|
|
|
{
|
|
|
_db.save(path);
|
|
|
}
|
|
|
|
|
|
+ /// Loads the empty level template.
|
|
|
+ public void load_empty_level()
|
|
|
+ {
|
|
|
+ load(_toolchain_dir + "core/editors/levels/empty.level");
|
|
|
+ }
|
|
|
+
|
|
|
+ public void spawn_unit(Guid id, string name, Vector3 pos, Quaternion rot, Vector3 scl)
|
|
|
+ {
|
|
|
+ on_unit_spawned(id, name, pos, rot, scl);
|
|
|
+ send_spawn_units(new Guid[] { id });
|
|
|
+ }
|
|
|
+
|
|
|
+ public void destroy_objects(Guid[] ids)
|
|
|
+ {
|
|
|
+ Guid[] units = {};
|
|
|
+ Guid[] sounds = {};
|
|
|
+
|
|
|
+ foreach (Guid id in ids)
|
|
|
+ {
|
|
|
+ if (is_unit(id))
|
|
|
+ units += id;
|
|
|
+ else if (is_sound(id))
|
|
|
+ sounds += id;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (units.length > 0)
|
|
|
+ {
|
|
|
+ _db.add_restore_point((int)ActionType.DESTROY_UNIT, units);
|
|
|
+ foreach (Guid id in units)
|
|
|
+ {
|
|
|
+ _db.remove_from_set(GUID_ZERO, "units", id);
|
|
|
+ _db.destroy(id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (sounds.length > 0)
|
|
|
+ {
|
|
|
+ _db.add_restore_point((int)ActionType.DESTROY_SOUND, sounds);
|
|
|
+ foreach (Guid id in sounds)
|
|
|
+ {
|
|
|
+ _db.remove_from_set(GUID_ZERO, "sounds", id);
|
|
|
+ _db.destroy(id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ send_destroy_objects(ids);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void move_selected_objects(Vector3 pos, Quaternion rot, Vector3 scl)
|
|
|
+ {
|
|
|
+ if (_selection.size == 0)
|
|
|
+ return;
|
|
|
+
|
|
|
+ Guid id = _selection.last();
|
|
|
+ on_move_objects(new Guid[] { id }, new Vector3[] { pos }, new Quaternion[] { rot }, new Vector3[] { scl });
|
|
|
+ send_move_objects(new Guid[] { id }, new Vector3[] { pos }, new Quaternion[] { rot }, new Vector3[] { scl });
|
|
|
+ }
|
|
|
+
|
|
|
+ public void duplicate_selected_objects()
|
|
|
+ {
|
|
|
+ if (_selection.size > 0)
|
|
|
+ {
|
|
|
+ Guid[] ids = new Guid[_selection.size];
|
|
|
+ // FIXME
|
|
|
+ {
|
|
|
+ Guid?[] tmp = _selection.to_array();
|
|
|
+ for (int i = 0; i < tmp.length; ++i)
|
|
|
+ ids[i] = tmp[i];
|
|
|
+ }
|
|
|
+ Guid[] new_ids = new Guid[ids.length];
|
|
|
+
|
|
|
+ for (int i = 0; i < new_ids.length; ++i)
|
|
|
+ new_ids[i] = Guid.new_guid();
|
|
|
+
|
|
|
+ duplicate_objects(ids, new_ids);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void destroy_selected_objects()
|
|
|
+ {
|
|
|
+ Guid[] ids = new Guid[_selection.size];
|
|
|
+ // FIXME
|
|
|
+ {
|
|
|
+ Guid?[] tmp = _selection.to_array();
|
|
|
+ for (int i = 0; i < tmp.length; ++i)
|
|
|
+ ids[i] = tmp[i];
|
|
|
+ }
|
|
|
+ _selection.clear();
|
|
|
+
|
|
|
+ destroy_objects(ids);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void duplicate_objects(Guid[] ids, Guid[] new_ids)
|
|
|
+ {
|
|
|
+ _db.add_restore_point((int)ActionType.DUPLICATE_OBJECTS, new_ids);
|
|
|
+ for (int i = 0; i < ids.length; ++i)
|
|
|
+ {
|
|
|
+ _db.duplicate(ids[i], new_ids[i]);
|
|
|
+
|
|
|
+ if (is_unit(ids[i]))
|
|
|
+ {
|
|
|
+ _db.add_to_set(GUID_ZERO, "units", new_ids[i]);
|
|
|
+ }
|
|
|
+ else if (is_sound(ids[i]))
|
|
|
+ {
|
|
|
+ _db.add_to_set(GUID_ZERO, "sounds", new_ids[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ send_spawn_objects(new_ids);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void on_unit_spawned(Guid id, string name, Vector3 pos, Quaternion rot, Vector3 scl)
|
|
|
+ {
|
|
|
+ load_prefab(name);
|
|
|
+
|
|
|
+ _db.add_restore_point((int)ActionType.SPAWN_UNIT, new Guid[] { id });
|
|
|
+ _db.create(id);
|
|
|
+ _db.set_property(id, "prefab", name);
|
|
|
+
|
|
|
+ Guid transform_id = GUID_ZERO;
|
|
|
+ if (has_component(id, "transform", ref transform_id))
|
|
|
+ {
|
|
|
+ set_component_property(id, transform_id, "data.position", pos);
|
|
|
+ set_component_property(id, transform_id, "data.rotation", rot);
|
|
|
+ set_component_property(id, transform_id, "data.scale", scl);
|
|
|
+ set_component_property(id, transform_id, "type", "transform");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _db.set_property(id, "position", pos);
|
|
|
+ _db.set_property(id, "rotation", rot);
|
|
|
+ _db.set_property(id, "scale", scl);
|
|
|
+ }
|
|
|
+ _db.add_to_set(GUID_ZERO, "units", id);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void on_sound_spawned(Guid id, string name, Vector3 pos, Quaternion rot, Vector3 scl, double range, double volume, bool loop)
|
|
|
+ {
|
|
|
+ _db.add_restore_point((int)ActionType.SPAWN_SOUND, new Guid[] { id });
|
|
|
+ _db.create(id);
|
|
|
+ _db.set_property(id, "position", pos);
|
|
|
+ _db.set_property(id, "rotation", rot);
|
|
|
+ _db.set_property(id, "name", name);
|
|
|
+ _db.set_property(id, "range", range);
|
|
|
+ _db.set_property(id, "volume", volume);
|
|
|
+ _db.set_property(id, "loop", loop);
|
|
|
+ _db.add_to_set(GUID_ZERO, "sounds", id);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void on_move_objects(Guid[] ids, Vector3[] positions, Quaternion[] rotations, Vector3[] scales)
|
|
|
+ {
|
|
|
+ _db.add_restore_point((int)ActionType.MOVE_OBJECTS, ids);
|
|
|
+
|
|
|
+ for (int i = 0; i < ids.length; ++i)
|
|
|
+ {
|
|
|
+ Guid id = ids[i];
|
|
|
+ Vector3 pos = positions[i];
|
|
|
+ Quaternion rot = rotations[i];
|
|
|
+ Vector3 scl = scales[i];
|
|
|
+
|
|
|
+ if (is_unit(id))
|
|
|
+ {
|
|
|
+ Guid transform_id = GUID_ZERO;
|
|
|
+
|
|
|
+ if (has_component(id, "transform", ref transform_id))
|
|
|
+ {
|
|
|
+ set_component_property(id, transform_id, "data.position", pos);
|
|
|
+ set_component_property(id, transform_id, "data.rotation", rot);
|
|
|
+ set_component_property(id, transform_id, "data.scale", scl);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ _db.set_property(id, "position", pos);
|
|
|
+ _db.set_property(id, "rotation", rot);
|
|
|
+ _db.set_property(id, "scale", scl);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (is_sound(id))
|
|
|
+ {
|
|
|
+ _db.set_property(id, "position", pos);
|
|
|
+ _db.set_property(id, "rotation", rot);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // FIXME: Hack to force update the component view
|
|
|
+ selection_changed(_selection);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void on_selection(Guid[] ids)
|
|
|
+ {
|
|
|
+ _selection.clear();
|
|
|
+ foreach (Guid id in ids)
|
|
|
+ _selection.add(id);
|
|
|
+
|
|
|
+ selection_changed(_selection);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void selection_set(Guid[] ids)
|
|
|
+ {
|
|
|
+ _selection.clear();
|
|
|
+ for (int i = 0; i < ids.length; ++i)
|
|
|
+ _selection.add(ids[i]);
|
|
|
+ _client.send_script(LevelEditorApi.selection_set(ids));
|
|
|
+
|
|
|
+ selection_changed(_selection);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void set_light(Guid unit_id, Guid component_id, string type, double range, double intensity, double spot_angle, Vector3 color)
|
|
|
+ {
|
|
|
+ set_component_property(unit_id, component_id, "data.type", type);
|
|
|
+ set_component_property(unit_id, component_id, "data.range", range);
|
|
|
+ set_component_property(unit_id, component_id, "data.intensity", intensity);
|
|
|
+ set_component_property(unit_id, component_id, "data.spot_angle", spot_angle);
|
|
|
+ set_component_property(unit_id, component_id, "data.color", color);
|
|
|
+ set_component_property(unit_id, component_id, "type", "light");
|
|
|
+
|
|
|
+ _client.send_script(LevelEditorApi.set_light(unit_id, type, range, intensity, spot_angle, color));
|
|
|
+ }
|
|
|
+
|
|
|
+ private void send_spawn_units(Guid[] ids)
|
|
|
+ {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ generate_spawn_unit_commands(ids, sb);
|
|
|
+ _client.send_script(sb.str);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void send_spawn_sounds(Guid[] ids)
|
|
|
+ {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ generate_spawn_sound_commands(ids, sb);
|
|
|
+ _client.send_script(sb.str);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void send_spawn_objects(Guid[] ids)
|
|
|
+ {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ for (int i = 0; i < ids.length; ++i)
|
|
|
+ {
|
|
|
+ if (is_unit(ids[i]))
|
|
|
+ {
|
|
|
+ generate_spawn_unit_commands(new Guid[] { ids[i] }, sb);
|
|
|
+ }
|
|
|
+ else if (is_sound(ids[i]))
|
|
|
+ {
|
|
|
+ generate_spawn_sound_commands(new Guid[] { ids[i] }, sb);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ _client.send_script(sb.str);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void send_destroy_objects(Guid[] ids)
|
|
|
+ {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ foreach (Guid id in ids)
|
|
|
+ sb.append(LevelEditorApi.destroy(id));
|
|
|
+
|
|
|
+ _client.send_script(sb.str);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void send_move_objects(Guid[] ids, Vector3[] positions, Quaternion[] rotations, Vector3[] scales)
|
|
|
+ {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ for (int i = 0; i < ids.length; ++i)
|
|
|
+ sb.append(LevelEditorApi.move_object(ids[i], positions[i], rotations[i], scales[i]));
|
|
|
+
|
|
|
+ _client.send_script(sb.str);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void send_level()
|
|
|
+ {
|
|
|
+ HashSet<Guid?> units = _db.get_property(GUID_ZERO, "units") as HashSet<Guid?>;
|
|
|
+ HashSet<Guid?> sounds = _db.get_property(GUID_ZERO, "sounds") as HashSet<Guid?>;
|
|
|
+
|
|
|
+ Guid[] unit_ids = new Guid[units.size];
|
|
|
+ Guid[] sound_ids = new Guid[sounds.size];
|
|
|
+
|
|
|
+ // FIXME
|
|
|
+ {
|
|
|
+ Guid?[] tmp = units.to_array();
|
|
|
+ for (int i = 0; i < tmp.length; ++i)
|
|
|
+ unit_ids[i] = tmp[i];
|
|
|
+ }
|
|
|
+ // FIXME
|
|
|
+ {
|
|
|
+ Guid?[] tmp = sounds.to_array();
|
|
|
+ for (int i = 0; i < tmp.length; ++i)
|
|
|
+ sound_ids[i] = tmp[i];
|
|
|
+ }
|
|
|
+
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ generate_spawn_unit_commands(unit_ids, sb);
|
|
|
+ generate_spawn_sound_commands(sound_ids, sb);
|
|
|
+ _client.send_script(sb.str);
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Loads the prefab name into the database of prefabs.
|
|
|
/// </summary>
|
|
|
- public void load_prefab(string name)
|
|
|
+ private void load_prefab(string name)
|
|
|
{
|
|
|
if (_loaded_prefabs.contains(name))
|
|
|
return;
|
|
|
@@ -96,7 +389,7 @@ namespace Crown
|
|
|
_loaded_prefabs.add(name);
|
|
|
}
|
|
|
|
|
|
- public void generate_spawn_unit_commands(Guid[] unit_ids, StringBuilder sb)
|
|
|
+ private void generate_spawn_unit_commands(Guid[] unit_ids, StringBuilder sb)
|
|
|
{
|
|
|
foreach (Guid unit_id in unit_ids)
|
|
|
{
|
|
|
@@ -164,7 +457,7 @@ namespace Crown
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void generate_spawn_sound_commands(Guid[] sound_ids, StringBuilder sb)
|
|
|
+ private void generate_spawn_sound_commands(Guid[] sound_ids, StringBuilder sb)
|
|
|
{
|
|
|
foreach (Guid sound_id in sound_ids)
|
|
|
{
|
|
|
@@ -173,37 +466,10 @@ namespace Crown
|
|
|
, (Quaternion)_db.get_property(sound_id, "rotation")
|
|
|
, (double) _db.get_property(sound_id, "range")
|
|
|
, (double) _db.get_property(sound_id, "volume")
|
|
|
- , (bool) _db.get_property(sound_id, "loop")
|
|
|
- );
|
|
|
- sb.append(s);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public void send()
|
|
|
- {
|
|
|
- HashSet<Guid?> units = _db.get_property(GUID_ZERO, "units") as HashSet<Guid?>;
|
|
|
- HashSet<Guid?> sounds = _db.get_property(GUID_ZERO, "sounds") as HashSet<Guid?>;
|
|
|
-
|
|
|
- Guid[] unit_ids = new Guid[units.size];
|
|
|
- Guid[] sound_ids = new Guid[sounds.size];
|
|
|
-
|
|
|
- // FIXME
|
|
|
- {
|
|
|
- Guid?[] tmp = units.to_array();
|
|
|
- for (int i = 0; i < tmp.length; ++i)
|
|
|
- unit_ids[i] = tmp[i];
|
|
|
- }
|
|
|
- // FIXME
|
|
|
- {
|
|
|
- Guid?[] tmp = sounds.to_array();
|
|
|
- for (int i = 0; i < tmp.length; ++i)
|
|
|
- sound_ids[i] = tmp[i];
|
|
|
- }
|
|
|
-
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- generate_spawn_unit_commands(unit_ids, sb);
|
|
|
- generate_spawn_sound_commands(sound_ids, sb);
|
|
|
- _client.send_script(sb.str);
|
|
|
+ , (bool) _db.get_property(sound_id, "loop")
|
|
|
+ );
|
|
|
+ sb.append(s);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
private void undo_redo_action(bool undo, int id, Guid[] data)
|
|
|
@@ -213,36 +479,36 @@ namespace Crown
|
|
|
case (int)ActionType.SPAWN_UNIT:
|
|
|
{
|
|
|
if (undo)
|
|
|
- do_destroy_objects(data);
|
|
|
+ send_destroy_objects(data);
|
|
|
else
|
|
|
- do_spawn_units(data);
|
|
|
+ send_spawn_units(data);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case (int)ActionType.DESTROY_UNIT:
|
|
|
{
|
|
|
if (undo)
|
|
|
- do_spawn_units(data);
|
|
|
+ send_spawn_units(data);
|
|
|
else
|
|
|
- do_destroy_objects(data);
|
|
|
+ send_destroy_objects(data);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case (int)ActionType.SPAWN_SOUND:
|
|
|
{
|
|
|
if (undo)
|
|
|
- do_destroy_objects(data);
|
|
|
+ send_destroy_objects(data);
|
|
|
else
|
|
|
- do_spawn_sounds(data);
|
|
|
+ send_spawn_sounds(data);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case (int)ActionType.DESTROY_SOUND:
|
|
|
{
|
|
|
if (undo)
|
|
|
- do_spawn_sounds(data);
|
|
|
+ send_spawn_sounds(data);
|
|
|
else
|
|
|
- do_destroy_objects(data);
|
|
|
+ send_destroy_objects(data);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
@@ -287,7 +553,7 @@ namespace Crown
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- do_move_objects(ids, positions, rotations, scales);
|
|
|
+ send_move_objects(ids, positions, rotations, scales);
|
|
|
// FIXME: Hack to force update the component view
|
|
|
selection_changed(_selection);
|
|
|
}
|
|
|
@@ -297,9 +563,9 @@ namespace Crown
|
|
|
{
|
|
|
Guid[] new_ids = data;
|
|
|
if (undo)
|
|
|
- do_destroy_objects(new_ids);
|
|
|
+ send_destroy_objects(new_ids);
|
|
|
else
|
|
|
- do_spawn_objects(new_ids);
|
|
|
+ send_spawn_objects(new_ids);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
@@ -309,267 +575,6 @@ namespace Crown
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void do_spawn_objects(Guid[] ids)
|
|
|
- {
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- for (int i = 0; i < ids.length; ++i)
|
|
|
- {
|
|
|
- if (is_unit(ids[i]))
|
|
|
- {
|
|
|
- generate_spawn_unit_commands(new Guid[] { ids[i] }, sb);
|
|
|
- }
|
|
|
- else if (is_sound(ids[i]))
|
|
|
- {
|
|
|
- generate_spawn_sound_commands(new Guid[] { ids[i] }, sb);
|
|
|
- }
|
|
|
- }
|
|
|
- _client.send_script(sb.str);
|
|
|
- }
|
|
|
-
|
|
|
- private void do_spawn_units(Guid[] ids)
|
|
|
- {
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- generate_spawn_unit_commands(ids, sb);
|
|
|
- _client.send_script(sb.str);
|
|
|
- }
|
|
|
-
|
|
|
- private void do_spawn_sounds(Guid[] ids)
|
|
|
- {
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- generate_spawn_sound_commands(ids, sb);
|
|
|
- _client.send_script(sb.str);
|
|
|
- }
|
|
|
-
|
|
|
- private void do_destroy_objects(Guid[] ids)
|
|
|
- {
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- foreach (Guid id in ids)
|
|
|
- sb.append(LevelEditorApi.destroy(id));
|
|
|
-
|
|
|
- _client.send_script(sb.str);
|
|
|
- }
|
|
|
-
|
|
|
- private void do_move_objects(Guid[] ids, Vector3[] positions, Quaternion[] rotations, Vector3[] scales)
|
|
|
- {
|
|
|
- StringBuilder sb = new StringBuilder();
|
|
|
- for (int i = 0; i < ids.length; ++i)
|
|
|
- sb.append(LevelEditorApi.move_object(ids[i], positions[i], rotations[i], scales[i]));
|
|
|
-
|
|
|
- _client.send_script(sb.str);
|
|
|
- }
|
|
|
-
|
|
|
- public void move_selected_objects(Vector3 pos, Quaternion rot, Vector3 scl)
|
|
|
- {
|
|
|
- if (_selection.size == 0)
|
|
|
- return;
|
|
|
-
|
|
|
- Guid id = _selection.last();
|
|
|
- on_move_objects(new Guid[] { id }, new Vector3[] { pos }, new Quaternion[] { rot }, new Vector3[] { scl });
|
|
|
- do_move_objects(new Guid[] { id }, new Vector3[] { pos }, new Quaternion[] { rot }, new Vector3[] { scl });
|
|
|
- }
|
|
|
-
|
|
|
- public void set_light(Guid unit_id, Guid component_id, string type, double range, double intensity, double spot_angle, Vector3 color)
|
|
|
- {
|
|
|
- set_component_property(unit_id, component_id, "data.type", type);
|
|
|
- set_component_property(unit_id, component_id, "data.range", range);
|
|
|
- set_component_property(unit_id, component_id, "data.intensity", intensity);
|
|
|
- set_component_property(unit_id, component_id, "data.spot_angle", spot_angle);
|
|
|
- set_component_property(unit_id, component_id, "data.color", color);
|
|
|
- set_component_property(unit_id, component_id, "type", "light");
|
|
|
-
|
|
|
- _client.send_script(LevelEditorApi.set_light(unit_id, type, range, intensity, spot_angle, color));
|
|
|
- }
|
|
|
-
|
|
|
- public void duplicate_selected_objects()
|
|
|
- {
|
|
|
- if (_selection.size > 0)
|
|
|
- {
|
|
|
- Guid[] ids = new Guid[_selection.size];
|
|
|
- // FIXME
|
|
|
- {
|
|
|
- Guid?[] tmp = _selection.to_array();
|
|
|
- for (int i = 0; i < tmp.length; ++i)
|
|
|
- ids[i] = tmp[i];
|
|
|
- }
|
|
|
- Guid[] new_ids = new Guid[ids.length];
|
|
|
-
|
|
|
- for (int i = 0; i < new_ids.length; ++i)
|
|
|
- new_ids[i] = Guid.new_guid();
|
|
|
-
|
|
|
- duplicate_objects(ids, new_ids);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public void destroy_selected_objects()
|
|
|
- {
|
|
|
- Guid[] ids = new Guid[_selection.size];
|
|
|
- // FIXME
|
|
|
- {
|
|
|
- Guid?[] tmp = _selection.to_array();
|
|
|
- for (int i = 0; i < tmp.length; ++i)
|
|
|
- ids[i] = tmp[i];
|
|
|
- }
|
|
|
- _selection.clear();
|
|
|
-
|
|
|
- destroy_objects(ids);
|
|
|
- }
|
|
|
-
|
|
|
- public void duplicate_objects(Guid[] ids, Guid[] new_ids)
|
|
|
- {
|
|
|
- _db.add_restore_point((int)ActionType.DUPLICATE_OBJECTS, new_ids);
|
|
|
- for (int i = 0; i < ids.length; ++i)
|
|
|
- {
|
|
|
- _db.duplicate(ids[i], new_ids[i]);
|
|
|
-
|
|
|
- if (is_unit(ids[i]))
|
|
|
- {
|
|
|
- _db.add_to_set(GUID_ZERO, "units", new_ids[i]);
|
|
|
- }
|
|
|
- else if (is_sound(ids[i]))
|
|
|
- {
|
|
|
- _db.add_to_set(GUID_ZERO, "sounds", new_ids[i]);
|
|
|
- }
|
|
|
- }
|
|
|
- do_spawn_objects(new_ids);
|
|
|
- }
|
|
|
-
|
|
|
- public void spawn_unit(Guid id, string name, Vector3 pos, Quaternion rot, Vector3 scl)
|
|
|
- {
|
|
|
- on_unit_spawned(id, name, pos, rot, scl);
|
|
|
- do_spawn_units(new Guid[] { id });
|
|
|
- }
|
|
|
-
|
|
|
- public void on_unit_spawned(Guid id, string name, Vector3 pos, Quaternion rot, Vector3 scl)
|
|
|
- {
|
|
|
- load_prefab(name);
|
|
|
-
|
|
|
- _db.add_restore_point((int)ActionType.SPAWN_UNIT, new Guid[] { id });
|
|
|
- _db.create(id);
|
|
|
- _db.set_property(id, "prefab", name);
|
|
|
-
|
|
|
- Guid transform_id = GUID_ZERO;
|
|
|
- if (has_component(id, "transform", ref transform_id))
|
|
|
- {
|
|
|
- set_component_property(id, transform_id, "data.position", pos);
|
|
|
- set_component_property(id, transform_id, "data.rotation", rot);
|
|
|
- set_component_property(id, transform_id, "data.scale", scl);
|
|
|
- set_component_property(id, transform_id, "type", "transform");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- _db.set_property(id, "position", pos);
|
|
|
- _db.set_property(id, "rotation", rot);
|
|
|
- _db.set_property(id, "scale", scl);
|
|
|
- }
|
|
|
- _db.add_to_set(GUID_ZERO, "units", id);
|
|
|
- }
|
|
|
-
|
|
|
- public void on_sound_spawned(Guid id, string name, Vector3 pos, Quaternion rot, Vector3 scl, double range, double volume, bool loop)
|
|
|
- {
|
|
|
- _db.add_restore_point((int)ActionType.SPAWN_SOUND, new Guid[] { id });
|
|
|
- _db.create(id);
|
|
|
- _db.set_property(id, "position", pos);
|
|
|
- _db.set_property(id, "rotation", rot);
|
|
|
- _db.set_property(id, "name", name);
|
|
|
- _db.set_property(id, "range", range);
|
|
|
- _db.set_property(id, "volume", volume);
|
|
|
- _db.set_property(id, "loop", loop);
|
|
|
- _db.add_to_set(GUID_ZERO, "sounds", id);
|
|
|
- }
|
|
|
-
|
|
|
- public void on_selection(Guid[] ids)
|
|
|
- {
|
|
|
- _selection.clear();
|
|
|
- foreach (Guid id in ids)
|
|
|
- _selection.add(id);
|
|
|
-
|
|
|
- selection_changed(_selection);
|
|
|
- }
|
|
|
-
|
|
|
- public void destroy_objects(Guid[] ids)
|
|
|
- {
|
|
|
- Guid[] units = {};
|
|
|
- Guid[] sounds = {};
|
|
|
-
|
|
|
- foreach (Guid id in ids)
|
|
|
- {
|
|
|
- if (is_unit(id))
|
|
|
- units += id;
|
|
|
- else if (is_sound(id))
|
|
|
- sounds += id;
|
|
|
- }
|
|
|
-
|
|
|
- if (units.length > 0)
|
|
|
- {
|
|
|
- _db.add_restore_point((int)ActionType.DESTROY_UNIT, units);
|
|
|
- foreach (Guid id in units)
|
|
|
- {
|
|
|
- _db.remove_from_set(GUID_ZERO, "units", id);
|
|
|
- _db.destroy(id);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (sounds.length > 0)
|
|
|
- {
|
|
|
- _db.add_restore_point((int)ActionType.DESTROY_SOUND, sounds);
|
|
|
- foreach (Guid id in sounds)
|
|
|
- {
|
|
|
- _db.remove_from_set(GUID_ZERO, "sounds", id);
|
|
|
- _db.destroy(id);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- do_destroy_objects(ids);
|
|
|
- }
|
|
|
-
|
|
|
- public void selection_set(Guid[] ids)
|
|
|
- {
|
|
|
- _selection.clear();
|
|
|
- for (int i = 0; i < ids.length; ++i)
|
|
|
- _selection.add(ids[i]);
|
|
|
- _client.send_script(LevelEditorApi.selection_set(ids));
|
|
|
-
|
|
|
- selection_changed(_selection);
|
|
|
- }
|
|
|
-
|
|
|
- public void on_move_objects(Guid[] ids, Vector3[] positions, Quaternion[] rotations, Vector3[] scales)
|
|
|
- {
|
|
|
- _db.add_restore_point((int)ActionType.MOVE_OBJECTS, ids);
|
|
|
-
|
|
|
- for (int i = 0; i < ids.length; ++i)
|
|
|
- {
|
|
|
- Guid id = ids[i];
|
|
|
- Vector3 pos = positions[i];
|
|
|
- Quaternion rot = rotations[i];
|
|
|
- Vector3 scl = scales[i];
|
|
|
-
|
|
|
- if (is_unit(id))
|
|
|
- {
|
|
|
- Guid transform_id = GUID_ZERO;
|
|
|
-
|
|
|
- if (has_component(id, "transform", ref transform_id))
|
|
|
- {
|
|
|
- set_component_property(id, transform_id, "data.position", pos);
|
|
|
- set_component_property(id, transform_id, "data.rotation", rot);
|
|
|
- set_component_property(id, transform_id, "data.scale", scl);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- _db.set_property(id, "position", pos);
|
|
|
- _db.set_property(id, "rotation", rot);
|
|
|
- _db.set_property(id, "scale", scl);
|
|
|
- }
|
|
|
- }
|
|
|
- else if (is_sound(id))
|
|
|
- {
|
|
|
- _db.set_property(id, "position", pos);
|
|
|
- _db.set_property(id, "rotation", rot);
|
|
|
- }
|
|
|
- }
|
|
|
- // FIXME: Hack to force update the component view
|
|
|
- selection_changed(_selection);
|
|
|
- }
|
|
|
-
|
|
|
public Value? get_property(Guid id, string key)
|
|
|
{
|
|
|
return _db.get_property(id, key);
|