Skip to content

Commit

Permalink
+ render movement direction of muscles
Browse files Browse the repository at this point in the history
+ cut-off activation functions for neurons
  • Loading branch information
chrxh committed Sep 11, 2024
1 parent e3a7fc2 commit 87d6908
Show file tree
Hide file tree
Showing 11 changed files with 66 additions and 6 deletions.
2 changes: 2 additions & 0 deletions source/EngineGpuKernels/ConstructorProcessor.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,8 @@ ConstructorProcessor::constructCellIntern(
result->cellFunctionData.muscle.mode = GenomeDecoder::readByte(constructor, genomeCurrentBytePosition) % MuscleMode_Count;
result->cellFunctionData.muscle.lastBendingDirection = MuscleBendingDirection_None;
result->cellFunctionData.muscle.consecutiveBendingAngle = 0;
result->cellFunctionData.muscle.lastMovementX = 0;
result->cellFunctionData.muscle.lastMovementY = 0;
} break;
case CellFunction_Defender: {
result->cellFunctionData.defender.mode = GenomeDecoder::readByte(constructor, genomeCurrentBytePosition) % DefenderMode_Count;
Expand Down
2 changes: 2 additions & 0 deletions source/EngineGpuKernels/DataAccessKernels.cu
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,8 @@ namespace
cellTO.cellFunctionData.muscle.lastBendingDirection = cell->cellFunctionData.muscle.lastBendingDirection;
cellTO.cellFunctionData.muscle.lastBendingSourceIndex = cell->cellFunctionData.muscle.lastBendingSourceIndex;
cellTO.cellFunctionData.muscle.consecutiveBendingAngle = cell->cellFunctionData.muscle.consecutiveBendingAngle;
cellTO.cellFunctionData.muscle.lastMovementX = cell->cellFunctionData.muscle.lastMovementX;
cellTO.cellFunctionData.muscle.lastMovementY = cell->cellFunctionData.muscle.lastMovementY;
} break;
case CellFunction_Defender: {
cellTO.cellFunctionData.defender.mode = cell->cellFunctionData.defender.mode;
Expand Down
12 changes: 8 additions & 4 deletions source/EngineGpuKernels/MuscleProcessor.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ __device__ __inline__ void MuscleProcessor::processCell(SimulationData& data, Si
auto activity = CellFunctionProcessor::calcInputActivity(cell);
CellFunctionProcessor::updateInvocationState(cell, activity);

cell->cellFunctionData.muscle.lastMovementX = 0;
cell->cellFunctionData.muscle.lastMovementY = 0;

switch (cell->cellFunctionData.muscle.mode) {
case MuscleMode_Movement: {
movement(data, statistics, cell, activity);
Expand All @@ -53,6 +56,7 @@ __device__ __inline__ void MuscleProcessor::processCell(SimulationData& data, Si
} break;
}

activity.channels[0] *= 0.95f;
CellFunctionProcessor::setActivity(cell, activity);
}

Expand Down Expand Up @@ -111,10 +115,10 @@ __device__ __inline__ void MuscleProcessor::movement(SimulationData& data, Simul
acceleration = cudaSimulationParameters.cellFunctionMuscleMovementAcceleration[cell->color];
}
float angle = max(-0.5f, min(0.5f, activity.channels[3])) * 360.0f;
direction = Math::rotateClockwise(direction, angle);
if (direction.x != 0 || direction.y != 0) {
cell->vel += Math::normalized(direction) * acceleration * getTruncatedUnitValue(activity);
}
direction = Math::normalized(Math::rotateClockwise(direction, angle)) * acceleration * max(0.0f, getTruncatedUnitValue(activity));
cell->vel += direction;
cell->cellFunctionData.muscle.lastMovementX = direction.x;
cell->cellFunctionData.muscle.lastMovementY = direction.y;
cell->releaseLock();
statistics.incNumMuscleActivities(cell->color);
}
Expand Down
4 changes: 2 additions & 2 deletions source/EngineGpuKernels/NeuronProcessor.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@ __inline__ __device__ float NeuronProcessor::applyActivationFunction(NeuronActiv
case NeuronActivationFunction_BinaryStep:
return x >= NEAR_ZERO ? 1.0f : 0.0f;
case NeuronActivationFunction_Identity:
return x;
return max(-1.0f, min(1.0f, x));
case NeuronActivationFunction_Abs:
return abs(x);
return min(1.0f, abs(x));
case NeuronActivationFunction_Gaussian:
return __expf(-2 * x * x);
}
Expand Down
4 changes: 4 additions & 0 deletions source/EngineGpuKernels/Object.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,10 @@ struct MuscleFunction
MuscleBendingDirection lastBendingDirection;
uint8_t lastBendingSourceIndex;
float consecutiveBendingAngle;

//additional rendering data
float lastMovementX;
float lastMovementY;
};

struct DefenderFunction
Expand Down
4 changes: 4 additions & 0 deletions source/EngineGpuKernels/ObjectFactory.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,8 @@ __inline__ __device__ void ObjectFactory::changeCellFromTO(DataTO const& dataTO,
cell->cellFunctionData.muscle.lastBendingDirection = cellTO.cellFunctionData.muscle.lastBendingDirection;
cell->cellFunctionData.muscle.lastBendingSourceIndex = cellTO.cellFunctionData.muscle.lastBendingSourceIndex;
cell->cellFunctionData.muscle.consecutiveBendingAngle = cellTO.cellFunctionData.muscle.consecutiveBendingAngle;
cell->cellFunctionData.muscle.lastMovementX = cellTO.cellFunctionData.muscle.lastMovementX;
cell->cellFunctionData.muscle.lastMovementY = cellTO.cellFunctionData.muscle.lastMovementY;
} break;
case CellFunction_Defender: {
cell->cellFunctionData.defender.mode = cellTO.cellFunctionData.defender.mode;
Expand Down Expand Up @@ -370,6 +372,8 @@ __inline__ __device__ Cell* ObjectFactory::createRandomCell(float energy, float2
cell->cellFunctionData.muscle.lastBendingDirection = MuscleBendingDirection_None;
cell->cellFunctionData.muscle.lastBendingSourceIndex = 0;
cell->cellFunctionData.muscle.consecutiveBendingAngle = 0;
cell->cellFunctionData.muscle.lastMovementX = 0;
cell->cellFunctionData.muscle.lastMovementY = 0;
} break;
case CellFunction_Defender: {
cell->cellFunctionData.defender.mode = _data->numberGen1.random(DefenderMode_Count - 1);
Expand Down
28 changes: 28 additions & 0 deletions source/EngineGpuKernels/RenderingKernels.cu
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,34 @@ __global__ void cudaDrawCells(
}
}

//draw muscle movements
if (cell->cellFunction == CellFunction_Muscle
&& (cell->cellFunctionData.muscle.lastMovementX != 0 || cell->cellFunctionData.muscle.lastMovementY != 0)) {

auto color = float3{0.7f, 0.7f, 0.7f} * min(1.0f, zoom * 0.1f);
auto endPos = cell->pos + float2{cell->cellFunctionData.muscle.lastMovementX, cell->cellFunctionData.muscle.lastMovementY} * 100;
auto endImagePos = mapWorldPosToImagePos(rectUpperLeft, endPos, universeImageSize, zoom);
if (isLineVisible(cellImagePos, endImagePos, universeImageSize)) {
drawLine(cellImagePos, endImagePos, color, imageData, imageSize);
}

auto arrowPos1 = endPos + float2{
-cell->cellFunctionData.muscle.lastMovementX + cell->cellFunctionData.muscle.lastMovementY,
-cell->cellFunctionData.muscle.lastMovementX - cell->cellFunctionData.muscle.lastMovementY} * 40;
auto arrowImagePos1 = mapWorldPosToImagePos(rectUpperLeft, arrowPos1, universeImageSize, zoom);
if (isLineVisible(arrowImagePos1, endImagePos, universeImageSize)) {
drawLine(arrowImagePos1, endImagePos, color, imageData, imageSize);
}

auto arrowPos2 = endPos + float2{
-cell->cellFunctionData.muscle.lastMovementX - cell->cellFunctionData.muscle.lastMovementY,
+cell->cellFunctionData.muscle.lastMovementX - cell->cellFunctionData.muscle.lastMovementY} * 40;
auto arrowImagePos2 = mapWorldPosToImagePos(rectUpperLeft, arrowPos2, universeImageSize, zoom);
if (isLineVisible(arrowImagePos2, endImagePos, universeImageSize)) {
drawLine(arrowImagePos2, endImagePos, color, imageData, imageSize);
}
}

//draw detonation
if (cell->cellFunction == CellFunction_Detonator) {
auto const& detonator = cell->cellFunctionData.detonator;
Expand Down
4 changes: 4 additions & 0 deletions source/EngineGpuKernels/TOs.cuh
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,10 @@ struct MuscleTO
MuscleBendingDirection lastBendingDirection;
uint8_t lastBendingSourceIndex;
float consecutiveBendingAngle;

//additional rendering data
float lastMovementX;
float lastMovementY;
};

struct DefenderTO
Expand Down
4 changes: 4 additions & 0 deletions source/EngineImpl/DescriptionConverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,8 @@ CellDescription DescriptionConverter::createCellDescription(DataTO const& dataTO
muscle.lastBendingDirection = cellTO.cellFunctionData.muscle.lastBendingDirection;
muscle.lastBendingSourceIndex = cellTO.cellFunctionData.muscle.lastBendingSourceIndex;
muscle.consecutiveBendingAngle = cellTO.cellFunctionData.muscle.consecutiveBendingAngle;
muscle.lastMovementX = cellTO.cellFunctionData.muscle.lastMovementX;
muscle.lastMovementY = cellTO.cellFunctionData.muscle.lastMovementY;
result.cellFunction = muscle;
} break;
case CellFunction_Defender: {
Expand Down Expand Up @@ -650,6 +652,8 @@ void DescriptionConverter::addCell(
muscleTO.lastBendingDirection = muscleDesc.lastBendingDirection;
muscleTO.lastBendingSourceIndex = muscleDesc.lastBendingSourceIndex;
muscleTO.consecutiveBendingAngle = muscleDesc.consecutiveBendingAngle;
muscleTO.lastMovementX = muscleDesc.lastMovementX;
muscleTO.lastMovementY = muscleDesc.lastMovementY;
cellTO.cellFunctionData.muscle = muscleTO;
} break;
case CellFunction_Defender: {
Expand Down
4 changes: 4 additions & 0 deletions source/EngineInterface/Descriptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,10 @@ struct MuscleDescription
int lastBendingSourceIndex = 0;
float consecutiveBendingAngle = 0;

//additional rendering data
float lastMovementX = 0;
float lastMovementY = 0;

auto operator<=>(MuscleDescription const&) const = default;

MuscleDescription& setMode(MuscleMode value)
Expand Down
4 changes: 4 additions & 0 deletions source/EngineInterface/SerializerService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,8 @@ namespace
auto constexpr Id_Muscle_LastBendingDirection = 1;
auto constexpr Id_Muscle_LastBendingSourceIndex = 4;
auto constexpr Id_Muscle_ConsecutiveBendingAngle = 3;
auto constexpr Id_Muscle_LastMovementX = 5;
auto constexpr Id_Muscle_LastMovementY = 6;

auto constexpr Id_Injector_Mode = 0;
auto constexpr Id_Injector_Counter = 1;
Expand Down Expand Up @@ -730,6 +732,8 @@ namespace cereal
loadSave<int>(task, auxiliaries, Id_Muscle_LastBendingDirection, data.lastBendingDirection, defaultObject.lastBendingDirection);
loadSave<int>(task, auxiliaries, Id_Muscle_LastBendingSourceIndex, data.lastBendingSourceIndex, defaultObject.lastBendingSourceIndex);
loadSave<float>(task, auxiliaries, Id_Muscle_ConsecutiveBendingAngle, data.consecutiveBendingAngle, defaultObject.consecutiveBendingAngle);
loadSave(task, auxiliaries, Id_Muscle_LastMovementX, data.lastMovementX, defaultObject.lastMovementX);
loadSave(task, auxiliaries, Id_Muscle_LastMovementY, data.lastMovementY, defaultObject.lastMovementY);
processLoadSaveMap(task, ar, auxiliaries);
}
SPLIT_SERIALIZATION(MuscleDescription)
Expand Down

0 comments on commit 87d6908

Please sign in to comment.