Skip to content

Commit

Permalink
Explosions and the railgun-terror are now executed in separate thread…
Browse files Browse the repository at this point in the history
…s. Also fixes some concurrency issues regarding simulators and bullet physics.

- Extends the Bullet Physics renderer to support adding blocks from threads
  • Loading branch information
begla committed Mar 4, 2012
1 parent c6cf73a commit 668c0a2
Show file tree
Hide file tree
Showing 7 changed files with 116 additions and 84 deletions.
1 change: 0 additions & 1 deletion src/org/terasology/logic/simulators/GrowthSimulator.java
Expand Up @@ -40,7 +40,6 @@ public GrowthSimulator(IWorldProvider parent) {

@Override
public boolean executeSimulation() {

if (_activeBlocks.isEmpty())
return false;

Expand Down
4 changes: 3 additions & 1 deletion src/org/terasology/logic/simulators/Simulator.java
Expand Up @@ -20,7 +20,9 @@
import org.terasology.logic.world.IWorldProvider;
import org.terasology.model.structures.BlockPosition;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
* Base class for all simulators.
Expand All @@ -36,7 +38,7 @@ public abstract class Simulator implements IBlockObserver {
protected long _lastUpdate = Terasology.getInstance().getTimeInMs();

protected final IWorldProvider _parent;
protected final HashSet<BlockPosition> _activeBlocks = new HashSet<BlockPosition>(256);
protected final Set<BlockPosition> _activeBlocks = Collections.synchronizedSet(new HashSet<BlockPosition>());

public Simulator(String name, IWorldProvider parent, long updateInterval) {
_updateInterval = updateInterval;
Expand Down
14 changes: 9 additions & 5 deletions src/org/terasology/logic/tools/ExplosionTool.java
Expand Up @@ -37,7 +37,14 @@ public ExplosionTool(Player player) {
}

public void executeLeftClickAction() {
explode();
Terasology.getInstance().submitTask("Explosion", new Runnable() {
public void run() {
explode();
}
});

AudioManager.play("Explode" + (_random.randomIntAbs(5) + 1));
_player.poke();
}

public void executeRightClickAction() {
Expand All @@ -52,7 +59,7 @@ public void explode() {
Vector3d origin = blockPos.toVector3d();

for (int i = 0; i < 256; i++) {
Vector3d direction = new Vector3d((float) worldProvider.getRandom().randomDouble(), (float) worldProvider.getRandom().randomDouble(), (float) worldProvider.getRandom().randomDouble());
Vector3d direction = new Vector3d((float) _random.randomDouble(), (float) _random.randomDouble(), (float) _random.randomDouble());
direction.normalize();
Vector3f impulse = new Vector3f(direction);
impulse.scale(800000);
Expand All @@ -79,9 +86,6 @@ public void explode() {
}
}
}

AudioManager.play("Explode" + (worldProvider.getRandom().randomIntAbs(5) + 1));
_player.poke();
}
}

Expand Down
21 changes: 13 additions & 8 deletions src/org/terasology/logic/tools/RailgunTool.java
Expand Up @@ -15,12 +15,12 @@
*/
package org.terasology.logic.tools;

import org.terasology.game.Terasology;
import org.terasology.logic.characters.Player;
import org.terasology.logic.manager.AudioManager;
import org.terasology.logic.world.IWorldProvider;
import org.terasology.model.blocks.Block;
import org.terasology.model.blocks.management.BlockManager;
import org.terasology.model.structures.BlockPosition;
import org.terasology.rendering.physics.BulletPhysicsRenderer;

import javax.vecmath.Vector3d;
Expand All @@ -36,26 +36,34 @@ public RailgunTool(Player player) {
}

public void executeLeftClickAction() {
explode();
Terasology.getInstance().submitTask("Railgun", new Runnable() {
public void run() {
explode();
}
});

AudioManager.play("Explode" + (_random.randomIntAbs(5) + 1));
_player.poke();
}

public void executeRightClickAction() {
// Nothing to do!
}

public void explode() {
IWorldProvider worldProvider = _player.getParent().getWorldProvider();

//if (_player.getSelectedBlock() != null) {
//BlockPosition blockPos = _player.getSelectedBlock().getBlockPosition();
//Vector3d origin = blockPos.toVector3d();
Vector3d dir = _player.getViewingDirection();
Vector3d origin = (Vector3d)_player.getPosition().clone();
for(int s = 4; s <= 10000; s+=30){
Vector3d origin = (Vector3d) _player.getPosition().clone();
for (int s = 4; s <= 10000; s += 30) {

origin.add(dir);

for (int i = 0; i < 64; i++) {
Vector3d direction = new Vector3d((float) worldProvider.getRandom().randomDouble(), (float) worldProvider.getRandom().randomDouble(), (float) worldProvider.getRandom().randomDouble());
Vector3d direction = new Vector3d((float) _random.randomDouble(), (float) _random.randomDouble(), (float) _random.randomDouble());
direction.normalize();
Vector3f impulse = new Vector3f(direction);
impulse.scale(800000);
Expand All @@ -82,9 +90,6 @@ public void explode() {
}
}
}

AudioManager.play("Explode" + (worldProvider.getRandom().randomIntAbs(5) + 1));
_player.poke();
}
}
}
3 changes: 3 additions & 0 deletions src/org/terasology/logic/tools/SimpleTool.java
Expand Up @@ -19,12 +19,15 @@
import org.terasology.logic.world.IWorldProvider;
import org.terasology.math.TeraMath;
import org.terasology.model.structures.BlockPosition;
import org.terasology.utilities.FastRandom;

/**
* TODO
*/
public class SimpleTool implements ITool {

protected static final FastRandom _random = new FastRandom();

protected final Player _player;

public SimpleTool(Player player) {
Expand Down
61 changes: 30 additions & 31 deletions src/org/terasology/logic/world/Chunk.java
Expand Up @@ -36,7 +36,6 @@
import org.terasology.rendering.primitives.ChunkMesh;
import org.terasology.rendering.primitives.ChunkTessellator;
import org.terasology.rendering.shader.ShaderProgram;
import org.terasology.rendering.world.WorldRenderer;
import org.terasology.utilities.FastRandom;
import org.terasology.utilities.Helper;

Expand Down Expand Up @@ -99,6 +98,7 @@ public class Chunk implements Comparable<Chunk>, Externalizable {
private RigidBody _rigidBody = null;
/* ----- */
private ReentrantLock _lock = new ReentrantLock();
private ReentrantLock _lockRigidBody = new ReentrantLock();

public enum LIGHT_TYPE {
BLOCK,
Expand Down Expand Up @@ -1010,52 +1010,51 @@ public void updateRigidBody() {
}

private void updateRigidBody(final ChunkMesh[] meshes) {
if (_rigidBody != null)
return;

if (meshes == null)
return;

if (meshes.length < VERTICAL_SEGMENTS)
if (_rigidBody != null || meshes == null || meshes.length < VERTICAL_SEGMENTS)
return;

Terasology.getInstance().submitTask("Update Chunk Collision", new Runnable() {
public void run() {
TriangleIndexVertexArray vertexArray = new TriangleIndexVertexArray();
try {
_lockRigidBody.lock();

int counter = 0;
for (int k = 0; k < Chunk.VERTICAL_SEGMENTS; k++) {
ChunkMesh mesh = meshes[k];
TriangleIndexVertexArray vertexArray = new TriangleIndexVertexArray();

if (mesh != null) {
IndexedMesh indexedMesh = mesh._indexedMesh;
int counter = 0;
for (int k = 0; k < Chunk.VERTICAL_SEGMENTS; k++) {
ChunkMesh mesh = meshes[k];

if (indexedMesh != null) {
vertexArray.addIndexedMesh(indexedMesh);
counter++;
}
if (mesh != null) {
IndexedMesh indexedMesh = mesh._indexedMesh;

mesh._indexedMesh = null;
if (indexedMesh != null) {
vertexArray.addIndexedMesh(indexedMesh);
counter++;
}

mesh._indexedMesh = null;
}
}
}

if (counter == VERTICAL_SEGMENTS) {
try {
BvhTriangleMeshShape shape = new BvhTriangleMeshShape(vertexArray, true);
if (counter == VERTICAL_SEGMENTS) {
try {
BvhTriangleMeshShape shape = new BvhTriangleMeshShape(vertexArray, true);

Matrix3f rot = new Matrix3f();
rot.setIdentity();
Matrix3f rot = new Matrix3f();
rot.setIdentity();

DefaultMotionState blockMotionState = new DefaultMotionState(new Transform(new Matrix4f(rot, new Vector3f((float) getPosition().x * Chunk.CHUNK_DIMENSION_X, (float) getPosition().y * Chunk.CHUNK_DIMENSION_Y, (float) getPosition().z * Chunk.CHUNK_DIMENSION_Z), 1.0f)));
DefaultMotionState blockMotionState = new DefaultMotionState(new Transform(new Matrix4f(rot, new Vector3f((float) getPosition().x * Chunk.CHUNK_DIMENSION_X, (float) getPosition().y * Chunk.CHUNK_DIMENSION_Y, (float) getPosition().z * Chunk.CHUNK_DIMENSION_Z), 1.0f)));

RigidBodyConstructionInfo blockConsInf = new RigidBodyConstructionInfo(0, blockMotionState, shape, new Vector3f());
_rigidBody = new RigidBody(blockConsInf);
RigidBodyConstructionInfo blockConsInf = new RigidBodyConstructionInfo(0, blockMotionState, shape, new Vector3f());
_rigidBody = new RigidBody(blockConsInf);

} catch (Exception e) {
Terasology.getInstance().getLogger().log(Level.WARNING, "Chunk failed to create rigid body.", e);
} catch (Exception e) {
Terasology.getInstance().getLogger().log(Level.WARNING, "Chunk failed to create rigid body.", e);
}
}
} finally {
_lockRigidBody.unlock();
}

}
});
}
Expand Down

0 comments on commit 668c0a2

Please sign in to comment.