Skip to content

Commit 37d076e

Browse files
committed
Even further optimizations to dot stimuli
1 parent 7a863b2 commit 37d076e

3 files changed

Lines changed: 35 additions & 30 deletions

File tree

Assets/Scripts/DotStimulus/Dot.cs

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ namespace DotStimulus
66
public class Dot
77
{
88
private readonly Vector2 _velocity;
9-
private Vector3 _position;
9+
public Vector3 Position { get; private set; }
10+
private Vector3 _currentPosition;
1011
private Vector3 _oldPosition;
11-
private readonly float _scale;
12+
public readonly float scale;
1213
private readonly StimulusSettings _settings;
1314

1415
private readonly float _apertureRadius;
@@ -18,14 +19,15 @@ public class Dot
1819
public Dot(Vector2 velocity, Vector3 startingPosition, StimulusSettings settings)
1920
{
2021
_velocity = velocity;
21-
_position = startingPosition;
22+
_currentPosition = startingPosition;
23+
Position = _currentPosition;
2224
_settings = settings;
2325
_elapsedTime = 0;
2426

2527
var dotSize = settings.dotSizeArcMinutes * Mathf.PI / (60 * 180) * settings.stimDepthMeters;
2628
_apertureRadius = Mathf.Tan(settings.apertureRadiusDegrees * Mathf.PI / 180) * settings.stimDepthMeters;
2729
_sqrApertureRadius = _apertureRadius * _apertureRadius;
28-
_scale = dotSize;
30+
scale = dotSize;
2931

3032
// In case first update puts dot outside circle
3133
var randomPosition = Random.insideUnitCircle * _apertureRadius;
@@ -37,35 +39,26 @@ public void UpdateDot()
3739
if (_elapsedTime > Random.Range(_settings.minDotLifetime, _settings.maxDotLifetime))
3840
{
3941
var randomPosition = Random.insideUnitCircle * _apertureRadius;
40-
_position.x = randomPosition.x;
41-
_position.z = randomPosition.y;
42+
_currentPosition.x = randomPosition.x;
43+
_currentPosition.z = randomPosition.y;
4244
_elapsedTime = 0.0f;
4345
}
4446
else
4547
{
46-
_position.x += _velocity.x * Time.deltaTime;
47-
_position.z += _velocity.y * Time.deltaTime;
48+
_currentPosition.x += _velocity.x * Time.deltaTime;
49+
_currentPosition.z += _velocity.y * Time.deltaTime;
4850

4951
// Square magnitude used for efficiency
50-
if (_position.sqrMagnitude > _sqrApertureRadius)
52+
if (_currentPosition.sqrMagnitude > _sqrApertureRadius)
5153
{
52-
_position.x = -_oldPosition.x;
53-
_position.z = -_oldPosition.z;
54+
_currentPosition.x = -_oldPosition.x;
55+
_currentPosition.z = -_oldPosition.z;
5456
}
5557
}
5658

59+
Position = _currentPosition;
5760
_elapsedTime += Time.deltaTime;
58-
_oldPosition = _position;
59-
}
60-
61-
public Vector3 GetPosition()
62-
{
63-
return _position;
64-
}
65-
66-
public float GetScale()
67-
{
68-
return _scale;
61+
_oldPosition = _currentPosition;
6962
}
7063
}
7164
}

Assets/Scripts/DotStimulus/DotManager.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,21 @@ public void Start()
3939
worldTransform.localPosition = localPosition;
4040
}
4141

42+
public void OnEnable()
43+
{
44+
for (var i = 0; i < _dots.Length; i++)
45+
{
46+
_shaderData.BufferLocalToWorld(transform.localToWorldMatrix, i);
47+
}
48+
}
49+
4250
public void Update()
4351
{
4452
var localStimulusToWorld = transform.localToWorldMatrix;
4553
for (var i = 0; i < _dots.Length; i++)
4654
{
4755
_dots[i].UpdateDot();
48-
_shaderData.UpdateMeshPropertiesBuffer(_dots, localStimulusToWorld, i);
56+
_shaderData.UpdateMeshPropertiesBuffer(_dots, i);
4957
}
5058

5159
var meshPropertiesBuffer = _shaderData.MeshPropertiesBuffer;

Assets/Scripts/DotStimulus/DotShaderData.cs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,15 @@ public DotShaderData(Mesh dotMesh, int numDots)
2525
ArgsBuffer.SetData(args);
2626
}
2727

28-
public void UpdateMeshPropertiesBuffer(Dot[] dots, Matrix4x4 stimulusCenterLocalToWorld, int i)
28+
public void BufferLocalToWorld(Matrix4x4 stimulusCenterLocalToWorld, int i)
2929
{
30-
MeshProps[i].LocalPosition = dots[i].GetPosition();
31-
MeshProps[i].LocalScale = dots[i].GetScale();
32-
MeshProps[i].ParentLocalToWorld = stimulusCenterLocalToWorld;
30+
MeshProps[i].parentLocalToWorld = stimulusCenterLocalToWorld;
31+
}
32+
33+
public void UpdateMeshPropertiesBuffer(Dot[] dots, int i)
34+
{
35+
MeshProps[i].localPosition = dots[i].Position;
36+
MeshProps[i].localScale = dots[i].scale;
3337
}
3438

3539
public void ClearBuffers()
@@ -42,9 +46,9 @@ public void ClearBuffers()
4246
}
4347

4448
public struct MeshProperties {
45-
public Vector3 LocalPosition;
46-
public float LocalScale;
47-
public Matrix4x4 ParentLocalToWorld;
49+
public Vector3 localPosition;
50+
public float localScale;
51+
public Matrix4x4 parentLocalToWorld;
4852

4953
public static int Size()
5054
{

0 commit comments

Comments
 (0)