[741] | 1 | // This file is a part of Framsticks SDK. http://www.framsticks.com/
|
---|
[972] | 2 | // Copyright (C) 1999-2020 Maciej Komosinski and Szymon Ulatowski.
|
---|
[741] | 3 | // See LICENSE.txt for details.
|
---|
| 4 |
|
---|
| 5 | #include "modelcheckpoints.h"
|
---|
| 6 |
|
---|
| 7 | ModelCheckpointSupport::ModelCheckpointSupport(ModelSelectionPropagator &msp, ModelViewInterface &_model_view)
|
---|
| 8 | :mod_sel_prop(msp), model_view(_model_view), mod(NULL), mod_checkpoints(NULL)
|
---|
| 9 | {
|
---|
| 10 | selection_enabled = false;
|
---|
| 11 | }
|
---|
| 12 |
|
---|
| 13 | ModelCheckpointSupport::~ModelCheckpointSupport()
|
---|
| 14 | {
|
---|
| 15 | freeModel();
|
---|
| 16 | }
|
---|
| 17 |
|
---|
| 18 | void ModelCheckpointSupport::enableSelection(bool e)
|
---|
| 19 | {
|
---|
| 20 | if (e == selection_enabled) return;
|
---|
| 21 | selection_enabled = e;
|
---|
| 22 | if (selection_enabled)
|
---|
| 23 | {
|
---|
| 24 | mod_sel_prop.addModelSelection(&model_view.getModelSelection());
|
---|
| 25 | mod_sel_prop.setModel(mod);
|
---|
| 26 | }
|
---|
| 27 | else
|
---|
| 28 | {
|
---|
| 29 | mod_sel_prop.removeModelSelection(&model_view.getModelSelection());
|
---|
| 30 | mod_sel_prop.setModel(NULL);
|
---|
| 31 | }
|
---|
| 32 |
|
---|
| 33 | }
|
---|
| 34 |
|
---|
| 35 | void ModelCheckpointSupport::freeModel()
|
---|
| 36 | {
|
---|
| 37 | enableSelection(false);
|
---|
| 38 | SAFEDELETE(mod);
|
---|
| 39 | SAFEDELETE(mod_checkpoints);
|
---|
| 40 | }
|
---|
| 41 |
|
---|
| 42 | int ModelCheckpointSupport::showGeno(const Geno* g, bool _use_checkpoints)
|
---|
| 43 | {
|
---|
| 44 | use_checkpoints = (g != NULL) && _use_checkpoints;
|
---|
| 45 | freeModel();
|
---|
| 46 | if (g != NULL)
|
---|
[999] | 47 | mod = new Model(*g, Model::SHAPETYPE_UNKNOWN, true, false);
|
---|
[741] | 48 | toguiCheckpoints(use_checkpoints ? EnabledUnknown : Disabled, 1, 1);
|
---|
| 49 | int ret = model_view.showModel(mod);
|
---|
| 50 | enableSelection(true);
|
---|
| 51 | return ret;
|
---|
| 52 | }
|
---|
| 53 |
|
---|
| 54 | void ModelCheckpointSupport::fromguiPhase(float p)
|
---|
| 55 | {
|
---|
| 56 | if (mod == NULL) return;
|
---|
| 57 | if (use_checkpoints && (mod_checkpoints == NULL))
|
---|
| 58 | {
|
---|
| 59 | if (p == current_value) return;
|
---|
[999] | 60 | mod_checkpoints = new Model(mod->getGeno(), Model::SHAPETYPE_UNKNOWN, false, true);
|
---|
[741] | 61 | if (mod_checkpoints->getCheckpointCount() > 1)
|
---|
| 62 | {
|
---|
| 63 | max_value = current_value = mod_checkpoints->getCheckpointCount() - 1;
|
---|
| 64 | current_index = mod_checkpoints->getCheckpointCount();
|
---|
| 65 | toguiCheckpoints(EnabledActive, current_value, current_value);
|
---|
| 66 | }
|
---|
| 67 | else
|
---|
| 68 | {
|
---|
| 69 | toguiCheckpoints(EnabledUnavailable, 1, 1);
|
---|
| 70 | }
|
---|
| 71 | }
|
---|
| 72 |
|
---|
| 73 | if (!(mod_checkpoints->getCheckpointCount() > 1))
|
---|
| 74 | return;
|
---|
| 75 |
|
---|
| 76 | current_value = p;
|
---|
| 77 | int i = int(current_value + 0.5);
|
---|
| 78 | if (current_value == max_value)
|
---|
| 79 | i = mod_checkpoints->getCheckpointCount();
|
---|
| 80 | if (i != current_index)
|
---|
| 81 | {
|
---|
| 82 | current_index = i;
|
---|
| 83 | if (current_index < mod_checkpoints->getCheckpointCount())
|
---|
| 84 | {
|
---|
[1255] | 85 | model_view.showModel(mod_checkpoints->getCheckpoint(i),false);
|
---|
[741] | 86 | enableSelection(false);
|
---|
| 87 | }
|
---|
| 88 | else
|
---|
| 89 | {
|
---|
[1255] | 90 | model_view.showModel(mod, false);
|
---|
[741] | 91 | enableSelection(true);
|
---|
| 92 | }
|
---|
| 93 | }
|
---|
| 94 | }
|
---|
| 95 |
|
---|
[1255] | 96 | int ModelCheckpointSupport::showModel(const Model *m, bool reset_view)
|
---|
[741] | 97 | {
|
---|
| 98 | freeModel();
|
---|
[1255] | 99 | return model_view.showModel(m, reset_view);
|
---|
[741] | 100 | }
|
---|
| 101 |
|
---|
| 102 | Model *ModelCheckpointSupport::getModel()
|
---|
| 103 | {
|
---|
| 104 | return mod ? mod : model_view.getModel();
|
---|
| 105 | }
|
---|
| 106 |
|
---|
| 107 | ModelSelection& ModelCheckpointSupport::getModelSelection()
|
---|
| 108 | {
|
---|
| 109 | return model_view.getModelSelection();
|
---|
| 110 | }
|
---|
| 111 |
|
---|
| 112 | ModelCheckpointSupport::CheckpointsMode ModelCheckpointSupport::getCheckpointsMode()
|
---|
| 113 | {
|
---|
| 114 | if (use_checkpoints)
|
---|
| 115 | {
|
---|
| 116 | if (mod_checkpoints == NULL)
|
---|
| 117 | return EnabledUnknown;
|
---|
| 118 | if (mod_checkpoints->getCheckpointCount() > 1)
|
---|
| 119 | return EnabledActive;
|
---|
| 120 | else
|
---|
| 121 | return EnabledUnavailable;
|
---|
| 122 | }
|
---|
| 123 | else
|
---|
| 124 | return Disabled;
|
---|
| 125 | }
|
---|
| 126 |
|
---|
| 127 | SString ModelCheckpointSupport::checkpointHint()
|
---|
| 128 | {
|
---|
| 129 | switch (getCheckpointsMode())
|
---|
| 130 | {
|
---|
| 131 | case EnabledUnknown: return SString("Drag horizontally to show developmental phases");
|
---|
| 132 | case EnabledUnavailable: return SString("Developmental phases not available for this genotype");
|
---|
| 133 | case EnabledActive:
|
---|
| 134 | if (current_index < mod_checkpoints->getCheckpointCount())
|
---|
| 135 | return SString::sprintf("Displaying developmental phase %d of %d", current_index, mod_checkpoints->getCheckpointCount());
|
---|
| 136 | else
|
---|
| 137 | return SString("Displaying the final phase of development");
|
---|
| 138 | }
|
---|
| 139 | return SString();
|
---|
| 140 | }
|
---|
| 141 |
|
---|