From be51df9deab2cf8414328d2d2e8792ffdb8b938a Mon Sep 17 00:00:00 2001 From: Christian Heinemann Date: Fri, 5 Jan 2024 11:35:14 +0100 Subject: [PATCH 1/7] README.md updated --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 74c614b1c..126ace78e 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ Further information and artwork: An Nvidia graphics card with compute capability 6.0 or higher is needed. Please check [https://en.wikipedia.org/wiki/CUDA#GPUs_supported](https://en.wikipedia.org/wiki/CUDA#GPUs_supported). # 💽 Installer -Installer for Windows: [alien-installer.msi](https://alien-project.org/media/files/alien-installer.msi) (Updated: 2024-01-04) +Installer for Windows: [alien-installer.msi](https://alien-project.org/media/files/alien-installer.msi) (Updated: 2024-01-05) In the case that the program crashes for an unknown reason, please refer to the troubleshooting section in [alien-project.org/downloads.html](https://alien-project.org/downloads.html). From f6ac4915323972f3957f981cbd5c3308126a4800 Mon Sep 17 00:00:00 2001 From: Christian Heinemann Date: Sat, 6 Jan 2024 10:01:40 +0100 Subject: [PATCH 2/7] trim beginning and ending whitespaces in folder names --- source/Network/NetworkResourceService.cpp | 55 ++++++++++++++--------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/source/Network/NetworkResourceService.cpp b/source/Network/NetworkResourceService.cpp index f3008251e..f6a7d9764 100644 --- a/source/Network/NetworkResourceService.cpp +++ b/source/Network/NetworkResourceService.cpp @@ -40,6 +40,26 @@ namespace } return true; } + + std::string trimWhitespace(const std::string& input) + { + auto start = input.find_first_not_of(" \t\n\r\f\v"); + if (start == std::string::npos) { + return ""; + } + auto end = input.find_last_not_of(" \t\n\r\f\v"); + return input.substr(start, end - start + 1); + } + + std::vector getNameParts(std::string const& resourceName) + { + std::vector parts; + boost::split(parts, resourceName, boost::is_any_of(FolderSeparator)); + for (auto& part : parts) { + part = trimWhitespace(part); + } + return parts; + } } std::unordered_map> NetworkResourceService::_treeTOtoRawTOcache; @@ -50,13 +70,12 @@ std::vector NetworkResourceService::createTreeTOs( { NetworkResourceService::invalidateCache(); - std::list treeToList; + std::list treeTOlist; for (auto const& rawTO : rawTOs) { //parse folder names - std::vector folderNames; std::string nameWithoutFolders; - boost::split(folderNames, rawTO->resourceName, boost::is_any_of(FolderSeparator)); + std::vector folderNames = getNameParts(rawTO->resourceName); if (!folderNames.empty()) { nameWithoutFolders = folderNames.back(); folderNames.pop_back(); @@ -64,16 +83,16 @@ std::vector NetworkResourceService::createTreeTOs( std::list::iterator bestMatchIter; int bestMatchEqualFolders; - if (!treeToList.empty()) { + if (!treeTOlist.empty()) { //find matching node - auto searchIter = treeToList.end(); + auto searchIter = treeTOlist.end(); bestMatchIter = searchIter; bestMatchEqualFolders = -1; - for (int i = 0; i < treeToList.size(); ++i) { + for (int i = 0; i < treeTOlist.size(); ++i) { --searchIter; - auto otherRawTO = *searchIter; - auto equalFolders = getNumEqualFolders(folderNames, otherRawTO->folderNames); + auto otherTreeTO = *searchIter; + auto equalFolders = getNumEqualFolders(folderNames, otherTreeTO->folderNames); if (equalFolders < bestMatchEqualFolders) { break; } @@ -84,7 +103,7 @@ std::vector NetworkResourceService::createTreeTOs( } ++bestMatchIter; } else { - bestMatchIter = treeToList.begin(); + bestMatchIter = treeTOlist.begin(); bestMatchEqualFolders = 0; } @@ -94,7 +113,7 @@ std::vector NetworkResourceService::createTreeTOs( treeTO->folderNames = std::vector(folderNames.begin(), folderNames.begin() + i + 1); treeTO->type = rawTO->resourceType; treeTO->node = BrowserFolder(); - bestMatchIter = treeToList.insert(bestMatchIter, treeTO); + bestMatchIter = treeTOlist.insert(bestMatchIter, treeTO); ++bestMatchIter; } @@ -104,11 +123,11 @@ std::vector NetworkResourceService::createTreeTOs( treeTO->type = rawTO->resourceType; treeTO->folderNames = folderNames; treeTO->node = leaf; - treeToList.insert(bestMatchIter, treeTO); + treeTOlist.insert(bestMatchIter, treeTO); } //calc folder lines - std::vector treeTOs(treeToList.begin(), treeToList.end()); + std::vector treeTOs(treeTOlist.begin(), treeTOlist.end()); for (int i = 0; i < treeTOs.size(); ++i) { auto& treeTO = treeTOs.at(i); @@ -268,16 +287,14 @@ void NetworkResourceService::invalidateCache() std::vector NetworkResourceService::getFolderNames(std::string const& resourceName) { - std::vector result; - boost::split(result, resourceName, boost::is_any_of(FolderSeparator)); + std::vector result = getNameParts(resourceName); result.pop_back(); return result; } std::string NetworkResourceService::removeFoldersFromName(std::string const& resourceName) { - std::vector parts; - boost::split(parts, resourceName, boost::is_any_of(FolderSeparator)); + std::vector parts = getNameParts(resourceName); return parts.back(); } @@ -285,8 +302,7 @@ std::set> NetworkResourceService::getFolderNames(std::v { std::set> result; for (auto const& rawTO : rawTOs) { - std::vector folderNames; - boost::split(folderNames, rawTO->resourceName, boost::is_any_of(FolderSeparator)); + std::vector folderNames = getNameParts(rawTO->resourceName); for (int i = 0; i < toInt(folderNames.size()) - minNesting; ++i) { result.insert(std::vector(folderNames.begin(), folderNames.begin() + minNesting + i)); } @@ -319,8 +335,7 @@ std::set> NetworkResourceService::convertSettingsToFold std::set> result; for (auto const& part : parts) { - std::vector splittedParts; - boost::split(splittedParts, part, boost::is_any_of(FolderSeparator)); + std::vector splittedParts = getNameParts(part); result.insert(splittedParts); } return result; From 8e3d628d7062163a0340b52ee9cd43e3c9aec1ea Mon Sep 17 00:00:00 2001 From: Christian Heinemann Date: Sat, 6 Jan 2024 10:02:45 +0100 Subject: [PATCH 3/7] apply flow fields also to energy particles --- source/EngineGpuKernels/CellProcessor.cuh | 2 +- source/EngineGpuKernels/FlowFieldKernels.cu | 47 +++++++++++++++------ 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/source/EngineGpuKernels/CellProcessor.cuh b/source/EngineGpuKernels/CellProcessor.cuh index 43444f2e4..5a77ce478 100644 --- a/source/EngineGpuKernels/CellProcessor.cuh +++ b/source/EngineGpuKernels/CellProcessor.cuh @@ -395,7 +395,7 @@ __inline__ __device__ void CellProcessor::applyForces(SimulationData& data) continue; } - cell->vel +=cell->shared1; + cell->vel += cell->shared1; if (Math::length(cell->vel) > cudaSimulationParameters.cellMaxVelocity) { cell->vel = Math::normalized(cell->vel) * cudaSimulationParameters.cellMaxVelocity; } diff --git a/source/EngineGpuKernels/FlowFieldKernels.cu b/source/EngineGpuKernels/FlowFieldKernels.cu index 63b5f287c..18a8618f8 100644 --- a/source/EngineGpuKernels/FlowFieldKernels.cu +++ b/source/EngineGpuKernels/FlowFieldKernels.cu @@ -47,24 +47,43 @@ namespace __global__ void cudaApplyFlowFieldSettings(SimulationData data) { - auto& cells = data.objects.cellPointers; - auto partition = calcAllThreadsPartition(cells.getNumEntries()); - float2 accelerations[MAX_SPOTS]; - for (int index = partition.startIndex; index <= partition.endIndex; ++index) { - auto& cell = cells.at(index); - if (cell->barrier) { - continue; + { + auto& cells = data.objects.cellPointers; + auto partition = calcAllThreadsPartition(cells.getNumEntries()); + + for (int index = partition.startIndex; index <= partition.endIndex; ++index) { + auto& cell = cells.at(index); + if (cell->barrier) { + continue; + } + int numFlowFields = 0; + for (int i = 0; i < cudaSimulationParameters.numSpots; ++i) { + + if (cudaSimulationParameters.spots[i].flowType != FlowType_None) { + accelerations[numFlowFields] = calcAcceleration(data.cellMap, cell->pos, i); + ++numFlowFields; + } + } + auto resultingAcceleration = SpotCalculator::calcResultingFlowField(data.cellMap, cell->pos, float2{0, 0}, accelerations); + cell->shared1 += resultingAcceleration; } - int numFlowFields = 0; - for (int i = 0; i < cudaSimulationParameters.numSpots; ++i) { + } + { + auto& particles = data.objects.particlePointers; + auto partition = calcAllThreadsPartition(particles.getNumEntries()); + for (int index = partition.startIndex; index <= partition.endIndex; ++index) { + auto& particle = particles.at(index); + int numFlowFields = 0; + for (int i = 0; i < cudaSimulationParameters.numSpots; ++i) { - if (cudaSimulationParameters.spots[i].flowType != FlowType_None) { - accelerations[numFlowFields] = calcAcceleration(data.cellMap, cell->pos, i); - ++numFlowFields; + if (cudaSimulationParameters.spots[i].flowType != FlowType_None) { + accelerations[numFlowFields] = calcAcceleration(data.cellMap, particle->absPos, i); + ++numFlowFields; + } } + auto resultingAcceleration = SpotCalculator::calcResultingFlowField(data.cellMap, particle->absPos, float2{0, 0}, accelerations); + particle->vel += resultingAcceleration; } - auto resultingAcceleration = SpotCalculator::calcResultingFlowField(data.cellMap, cell->pos, float2{0, 0}, accelerations); - cell->shared1 += resultingAcceleration; } } From 9e3c36917778f25a17a0b13e271c47202bb055ca Mon Sep 17 00:00:00 2001 From: Christian Heinemann Date: Sat, 6 Jan 2024 17:28:16 +0100 Subject: [PATCH 4/7] energy particle splitting + threshold parameter --- source/EngineGpuKernels/Math.cuh | 6 ++ source/EngineGpuKernels/ParticleProcessor.cuh | 58 ++++++++++++++----- source/EngineGpuKernels/SimulationKernels.cu | 2 + .../AuxiliaryDataParserService.cpp | 2 + source/EngineInterface/SimulationParameters.h | 11 ++++ source/Gui/CreatorWindow.cpp | 6 +- source/Gui/SimulationParametersWindow.cpp | 17 +++++- 7 files changed, 85 insertions(+), 17 deletions(-) diff --git a/source/EngineGpuKernels/Math.cuh b/source/EngineGpuKernels/Math.cuh index b575eeecd..f4aee8456 100644 --- a/source/EngineGpuKernels/Math.cuh +++ b/source/EngineGpuKernels/Math.cuh @@ -94,6 +94,12 @@ __inline__ __device__ __host__ bool operator==(int2 const& p, int2 const& q) return p.x == q.x && p.y == q.y; } +__inline__ __device__ __host__ void operator*=(float2& p, float const& q) +{ + p.x *= q; + p.y *= q; +} + __inline__ __device__ __host__ void operator+=(float2& p, float2 const& q) { p.x += q.x; diff --git a/source/EngineGpuKernels/ParticleProcessor.cuh b/source/EngineGpuKernels/ParticleProcessor.cuh index 22170b629..2c50fca75 100644 --- a/source/EngineGpuKernels/ParticleProcessor.cuh +++ b/source/EngineGpuKernels/ParticleProcessor.cuh @@ -15,6 +15,7 @@ public: __inline__ __device__ static void updateMap(SimulationData& data); __inline__ __device__ static void movement(SimulationData& data); __inline__ __device__ static void collision(SimulationData& data); + __inline__ __device__ static void splitting(SimulationData& data); __inline__ __device__ static void transformation(SimulationData& data); __inline__ __device__ static void radiate(SimulationData& data, float2 pos, float2 vel, int color, float energy); //return needed energy @@ -29,7 +30,7 @@ private: __inline__ __device__ void ParticleProcessor::updateMap(SimulationData& data) { - auto partition = calcPartition(data.objects.particlePointers.getNumEntries(), blockIdx.x, gridDim.x); + auto partition = calcPartition(data.objects.particlePointers.getNumOrigEntries(), blockIdx.x, gridDim.x); Particle** particlePointers = &data.objects.particlePointers.at(partition.startIndex); data.particleMap.set_block(partition.numElements(), particlePointers); @@ -37,8 +38,7 @@ __inline__ __device__ void ParticleProcessor::updateMap(SimulationData& data) __inline__ __device__ void ParticleProcessor::movement(SimulationData& data) { - auto partition = calcPartition( - data.objects.particlePointers.getNumEntries(), threadIdx.x + blockIdx.x * blockDim.x, blockDim.x * gridDim.x); + auto partition = calcAllThreadsPartition(data.objects.particlePointers.getNumOrigEntries()); for (int particleIndex = partition.startIndex; particleIndex <= partition.endIndex; ++particleIndex) { auto& particle = data.objects.particlePointers.at(particleIndex); @@ -49,8 +49,7 @@ __inline__ __device__ void ParticleProcessor::movement(SimulationData& data) __inline__ __device__ void ParticleProcessor::collision(SimulationData& data) { - auto partition = calcPartition( - data.objects.particlePointers.getNumEntries(), threadIdx.x + blockIdx.x * blockDim.x, blockDim.x * gridDim.x); + auto partition = calcAllThreadsPartition(data.objects.particlePointers.getNumOrigEntries()); for (int particleIndex = partition.startIndex; particleIndex <= partition.endIndex; ++particleIndex) { auto& particle = data.objects.particlePointers.at(particleIndex); @@ -63,15 +62,12 @@ __inline__ __device__ void ParticleProcessor::collision(SimulationData& data) if (lock.tryLock()) { if (particle->energy > NEAR_ZERO && otherParticle->energy > NEAR_ZERO) { - if (cudaSimulationParameters.particleTransformationAllowed - || particle->energy + otherParticle->energy < MaxFusionEnergy) { - auto factor1 = particle->energy / (particle->energy + otherParticle->energy); - otherParticle->vel = particle->vel * factor1 + otherParticle->vel * (1.0f - factor1); - otherParticle->energy += particle->energy; - otherParticle->lastAbsorbedCell = nullptr; - particle->energy = 0; - particle = nullptr; - } + auto factor1 = particle->energy / (particle->energy + otherParticle->energy); + otherParticle->vel = particle->vel * factor1 + otherParticle->vel * (1.0f - factor1); + otherParticle->energy += particle->energy; + otherParticle->lastAbsorbedCell = nullptr; + particle->energy = 0; + particle = nullptr; } lock.releaseLock(); @@ -132,6 +128,40 @@ __inline__ __device__ void ParticleProcessor::collision(SimulationData& data) } } +__inline__ __device__ void ParticleProcessor::splitting(SimulationData& data) +{ + auto partition = calcAllThreadsPartition(data.objects.particlePointers.getNumOrigEntries()); + + for (int particleIndex = partition.startIndex; particleIndex <= partition.endIndex; ++particleIndex) { + auto& particle = data.objects.particlePointers.at(particleIndex); + if (particle == nullptr) { + continue; + } + if (data.numberGen1.random() >= 0.01f) { + continue; + } + + if (particle->energy > cudaSimulationParameters.particleSplitEnergy[particle->color]) { + particle->energy *= 0.5f; + auto velPerturbation = Math::unitVectorOfAngle(data.numberGen1.random() * 360); + + float2 otherPos = particle->absPos + velPerturbation / 5; + data.particleMap.correctPosition(otherPos); + + particle->absPos -= velPerturbation / 5; + data.particleMap.correctPosition(particle->absPos); + + velPerturbation *= cudaSimulationParameters.radiationVelocityPerturbation / (particle->energy + 1.0f); + float2 otherVel = particle->vel + velPerturbation; + + particle->vel -= velPerturbation; + ObjectFactory factory; + factory.init(&data); + factory.createParticle(particle->energy, otherPos, otherVel, particle->color); + } + } +} + __inline__ __device__ void ParticleProcessor::transformation(SimulationData& data) { if (!cudaSimulationParameters.particleTransformationAllowed) { diff --git a/source/EngineGpuKernels/SimulationKernels.cu b/source/EngineGpuKernels/SimulationKernels.cu index bc47fc749..3081f7b25 100644 --- a/source/EngineGpuKernels/SimulationKernels.cu +++ b/source/EngineGpuKernels/SimulationKernels.cu @@ -61,6 +61,8 @@ __global__ void cudaNextTimestep_physics_verletPositionUpdate(SimulationData dat { CellProcessor::verletPositionUpdate(data); CellProcessor::checkConnections(data); + + ParticleProcessor::splitting(data); } __global__ void cudaNextTimestep_physics_calcConnectionForces(SimulationData data, bool considerAngles) diff --git a/source/EngineInterface/AuxiliaryDataParserService.cpp b/source/EngineInterface/AuxiliaryDataParserService.cpp index 2b589c96a..5618f2625 100644 --- a/source/EngineInterface/AuxiliaryDataParserService.cpp +++ b/source/EngineInterface/AuxiliaryDataParserService.cpp @@ -592,6 +592,8 @@ namespace defaultParameters.particleTransformationMaxGenomeSize, "simulation parameters.particle.transformation.max genome size", parserTask); + encodeDecodeProperty( + tree, parameters.particleSplitEnergy, defaultParameters.particleSplitEnergy, "simulation parameters.particle.split energy", parserTask); encodeDecodeProperty( tree, diff --git a/source/EngineInterface/SimulationParameters.h b/source/EngineInterface/SimulationParameters.h index e9cd40a1e..dfcfee632 100644 --- a/source/EngineInterface/SimulationParameters.h +++ b/source/EngineInterface/SimulationParameters.h @@ -66,6 +66,14 @@ struct SimulationParameters bool particleTransformationAllowed = false; bool particleTransformationRandomCellFunction = false; int particleTransformationMaxGenomeSize = 300; + ColorVector particleSplitEnergy = { + Infinity::value, + Infinity::value, + Infinity::value, + Infinity::value, + Infinity::value, + Infinity::value, + Infinity::value}; ColorVector cellFunctionConstructorOffspringDistance = {2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f}; ColorVector cellFunctionConstructorConnectingCellMaxDistance = {1.8f, 1.8f, 1.8f, 1.8f, 1.8f, 1.8f, 1.8f}; @@ -174,6 +182,9 @@ struct SimulationParameters } for (int i = 0; i < MAX_COLORS; ++i) { + if (particleSplitEnergy[i] != other.particleSplitEnergy[i]) { + return false; + } if (cellFunctionAttackerSensorDetectionFactor[i] != other.cellFunctionAttackerSensorDetectionFactor[i]) { return false; } diff --git a/source/Gui/CreatorWindow.cpp b/source/Gui/CreatorWindow.cpp index 6a3789445..8a74f9187 100644 --- a/source/Gui/CreatorWindow.cpp +++ b/source/Gui/CreatorWindow.cpp @@ -141,8 +141,10 @@ void _CreatorWindow::processIntern() if (_mode != CreationMode_CreateParticle & _mode != CreationMode_CreateCell) { AlienImGui::Checkbox(AlienImGui::CheckboxParameters().name("Sticky").textWidth(RightColumnWidth).tooltip(Const::CreatorStickyTooltip), _makeSticky); } - AlienImGui::Checkbox( - AlienImGui::CheckboxParameters().name("Indestructible").textWidth(RightColumnWidth).tooltip(Const::CellIndestructibleTooltip), _barrier); + if (_mode != CreationMode_CreateParticle) { + AlienImGui::Checkbox( + AlienImGui::CheckboxParameters().name("Indestructible").textWidth(RightColumnWidth).tooltip(Const::CellIndestructibleTooltip), _barrier); + } } ImGui::EndChild(); diff --git a/source/Gui/SimulationParametersWindow.cpp b/source/Gui/SimulationParametersWindow.cpp index a0734f042..467a83442 100644 --- a/source/Gui/SimulationParametersWindow.cpp +++ b/source/Gui/SimulationParametersWindow.cpp @@ -530,12 +530,26 @@ void _SimulationParametersWindow::processBase( .colorDependence(true) .infinity(true) .min(0) - .max(100000) + .max(100000.0f) .logarithmic(true) .format("%.1f") .defaultValue(origSimParameters.highRadiationMinCellEnergy) .tooltip("The minimum energy of a cell can be defined here, from which it emits energy particles."), simParameters.highRadiationMinCellEnergy); + AlienImGui::SliderFloat( + AlienImGui::SliderFloatParameters() + .name("Split energy") + .textWidth(RightColumnWidth) + .colorDependence(true) + .infinity(true) + .min(1.0f) + .max(10000.0f) + .logarithmic(true) + .format("%.0f") + .defaultValue(origSimParameters.particleSplitEnergy) + .tooltip("The minimum energy of an energy particle after which it can split into two particles, whereby it receives a small momentum. The " + "splitting does not occur immediately, but only after a certain time."), + simParameters.particleSplitEnergy); AlienImGui::Checkbox( AlienImGui::CheckboxParameters() .name("Energy to cell transformation") @@ -1924,6 +1938,7 @@ void _SimulationParametersWindow::validationAndCorrection(SimulationParameters& parameters.cellFunctionConstructorExternalEnergySupplyRate[i] = std::max(0.0f, std::min(1.0f, parameters.cellFunctionConstructorExternalEnergySupplyRate[i])); parameters.baseValues.cellMinEnergy[i] = std::min(parameters.baseValues.cellMinEnergy[i], parameters.cellNormalEnergy[i] * 0.95f); + parameters.particleSplitEnergy[i] = std::max(0.0f, parameters.particleSplitEnergy[i]); } parameters.baseValues.cellMaxBindingEnergy = std::max(10.0f, parameters.baseValues.cellMaxBindingEnergy); parameters.timestepSize = std::max(0.0f, parameters.timestepSize); From 85ae20331a9efa5da3f89f123ba924e3132b4f7a Mon Sep 17 00:00:00 2001 From: Christian Heinemann Date: Sat, 6 Jan 2024 17:40:58 +0100 Subject: [PATCH 5/7] RELEASE-NOTES.md and version updated --- README.md | 2 +- RELEASE-NOTES.md | 11 +++++++++-- source/Base/Resources.h | 2 +- source/Gui/SimulationParametersWindow.cpp | 2 +- vcpkg.json | 2 +- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 126ace78e..645c24037 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ Further information and artwork: An Nvidia graphics card with compute capability 6.0 or higher is needed. Please check [https://en.wikipedia.org/wiki/CUDA#GPUs_supported](https://en.wikipedia.org/wiki/CUDA#GPUs_supported). # 💽 Installer -Installer for Windows: [alien-installer.msi](https://alien-project.org/media/files/alien-installer.msi) (Updated: 2024-01-05) +Installer for Windows: [alien-installer.msi](https://alien-project.org/media/files/alien-installer.msi) (Updated: 2024-01-06) In the case that the program crashes for an unknown reason, please refer to the troubleshooting section in [alien-project.org/downloads.html](https://alien-project.org/downloads.html). diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 9392c2759..829f35c15 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -1,5 +1,12 @@ # Release notes +## [4.7.2] - 2024-01-06 +### Added +- engine, gui/simulation parameters: splitting of energy particles above a certain minimum energy + +### Fixed +- gui/browser: beginning and ending whitespaces of folder names are ignored for automatic grouping + ## [4.7.1] - 2024-01-05 ### Added - gui/browser: shared symbol in private workspace in front of items to indicate if it is public @@ -20,11 +27,11 @@ - gui/browser: cache for speeding up downloading simulations - gui/upload dialog: validation of user input to allowed characters - gui/upload dialog: upload simulation or genome to folder -- gui/simulation parameters, model: individual cell color mutation +- engine, gui/simulation parameters: individual cell color mutation ### Changed - gui/browser: layout (in particular, new widget for selecting workspace) -- model: restrict the fusion of energy particles to certain energies +- engine: restrict the fusion of energy particles to certain energies ## [4.6.0] - 2023-12-29 ### Added diff --git a/source/Base/Resources.h b/source/Base/Resources.h index f40311da7..675e6b22c 100644 --- a/source/Base/Resources.h +++ b/source/Base/Resources.h @@ -2,7 +2,7 @@ namespace Const { - std::string const ProgramVersion = "4.7.1"; + std::string const ProgramVersion = "4.7.2"; std::string const DiscordLink = "https://discord.gg/7bjyZdXXQ2"; std::string const BasePath = "resources/"; diff --git a/source/Gui/SimulationParametersWindow.cpp b/source/Gui/SimulationParametersWindow.cpp index 467a83442..70acaddd4 100644 --- a/source/Gui/SimulationParametersWindow.cpp +++ b/source/Gui/SimulationParametersWindow.cpp @@ -538,7 +538,7 @@ void _SimulationParametersWindow::processBase( simParameters.highRadiationMinCellEnergy); AlienImGui::SliderFloat( AlienImGui::SliderFloatParameters() - .name("Split energy") + .name("Minimum split energy") .textWidth(RightColumnWidth) .colorDependence(true) .infinity(true) diff --git a/vcpkg.json b/vcpkg.json index 7babc788b..c593c089c 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,6 +1,6 @@ { "name": "alien", - "version": "4.7.1", + "version": "4.7.2", "dependencies": [ { "name": "glew", From 585ce2ba0d35f6c722f970e0eddf9f280c69db60 Mon Sep 17 00:00:00 2001 From: Christian Heinemann Date: Sat, 6 Jan 2024 17:51:42 +0100 Subject: [PATCH 6/7] RELEASE-NOTES.md --- RELEASE-NOTES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 829f35c15..02bc9fd89 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -3,6 +3,7 @@ ## [4.7.2] - 2024-01-06 ### Added - engine, gui/simulation parameters: splitting of energy particles above a certain minimum energy +- engine: flow fields also affect energy particles ### Fixed - gui/browser: beginning and ending whitespaces of folder names are ignored for automatic grouping From c44ea85fe3e58b266fe8e75c448de353d0680380 Mon Sep 17 00:00:00 2001 From: Christian Heinemann Date: Sat, 6 Jan 2024 18:18:33 +0100 Subject: [PATCH 7/7] RELEASE-NOTES.md updated --- RELEASE-NOTES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 02bc9fd89..6a476a0c3 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -3,7 +3,7 @@ ## [4.7.2] - 2024-01-06 ### Added - engine, gui/simulation parameters: splitting of energy particles above a certain minimum energy -- engine: flow fields also affect energy particles +- engine: force fields also affect energy particles ### Fixed - gui/browser: beginning and ending whitespaces of folder names are ignored for automatic grouping