mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2025-10-30 08:11:25 +00:00
improve performance of a lot of things
This commit is contained in:
parent
b2cd2d63a3
commit
b8df31324b
6 changed files with 50 additions and 28 deletions
|
|
@ -1,5 +1,6 @@
|
|||
package src;
|
||||
|
||||
import h3d.col.Bounds;
|
||||
import h3d.col.Plane;
|
||||
import h3d.mat.Material;
|
||||
import h3d.prim.Cube;
|
||||
|
|
@ -239,18 +240,23 @@ class CameraController extends Object {
|
|||
var rayCastDirection = camera.pos.sub(rayCastOrigin);
|
||||
rayCastDirection = rayCastDirection.add(rayCastDirection.normalized().multiply(2));
|
||||
|
||||
var results = level.collisionWorld.rayCast(rayCastOrigin, rayCastDirection);
|
||||
var rayCastLen = rayCastDirection.length();
|
||||
|
||||
var firstHit:octree.OctreeIntersection = null;
|
||||
var results = level.collisionWorld.rayCast(rayCastOrigin, rayCastDirection.normalized(), rayCastLen);
|
||||
|
||||
var firstHit:octree.IOctreeObject.RayIntersectionData = null;
|
||||
var firstHitDistance = 1e8;
|
||||
for (result in results) {
|
||||
if (!processedShapes.contains(result.object) && (firstHit == null || (result.distance < firstHit.distance))) {
|
||||
if (!processedShapes.contains(result.object)
|
||||
&& (firstHit == null || (rayCastOrigin.distance(result.point) < firstHitDistance))) {
|
||||
firstHit = result;
|
||||
firstHitDistance = rayCastOrigin.distance(result.point);
|
||||
processedShapes.push(result.object);
|
||||
}
|
||||
}
|
||||
|
||||
if (firstHit != null) {
|
||||
if (firstHit.distance < CameraDistance) {
|
||||
if (firstHitDistance < CameraDistance) {
|
||||
// camera.pos = marblePosition.sub(directionVector.multiply(firstHit.distance * 0.7));
|
||||
var plane = new Plane(firstHit.normal.x, firstHit.normal.y, firstHit.normal.z, firstHit.point.dot(firstHit.normal));
|
||||
var normal = firstHit.normal.multiply(-1);
|
||||
|
|
|
|||
|
|
@ -814,12 +814,6 @@ class DtsObject extends GameObject {
|
|||
for (i in info.indices) {
|
||||
if (pos >= prim.points.length) {
|
||||
meshIndex++;
|
||||
if (prim.buffer != null) {
|
||||
// prim.addNormals();
|
||||
// for (norm in prim.normals)
|
||||
// norm = norm.multiply(-1);
|
||||
prim.flush();
|
||||
}
|
||||
mesh.primitive = prim;
|
||||
mesh = cast info.geometry.children[meshIndex];
|
||||
prim = cast mesh.primitive;
|
||||
|
|
|
|||
|
|
@ -25,7 +25,9 @@ typedef MeshInstance = {
|
|||
}
|
||||
|
||||
class InstanceManager {
|
||||
var objects:Map<String, Array<MeshBatchInfo>> = new Map();
|
||||
var objects:Array<Array<MeshBatchInfo>> = [];
|
||||
|
||||
var objectMap:Map<String, Int> = [];
|
||||
var scene:Scene;
|
||||
|
||||
public function new(scene:Scene) {
|
||||
|
|
@ -33,7 +35,7 @@ class InstanceManager {
|
|||
}
|
||||
|
||||
public function update(dt:Float) {
|
||||
for (obj => meshes in objects) {
|
||||
for (meshes in objects) {
|
||||
for (minfo in meshes) {
|
||||
if (minfo.meshbatch != null) {
|
||||
var opaqueinstances = minfo.instances.filter(x -> x.gameObject.currentOpacity == 1);
|
||||
|
|
@ -43,7 +45,7 @@ class InstanceManager {
|
|||
if (dtsShader != null) {
|
||||
dtsShader.currentOpacity = instance.gameObject.currentOpacity;
|
||||
}
|
||||
var transform = instance.emptyObj.getAbsPos().clone();
|
||||
var transform = instance.emptyObj.getAbsPos();
|
||||
minfo.meshbatch.material.mainPass.setPassName(minfo.mesh.material.mainPass.name);
|
||||
minfo.meshbatch.material.mainPass.enableLights = minfo.mesh.material.mainPass.enableLights;
|
||||
minfo.meshbatch.setTransform(transform);
|
||||
|
|
@ -68,7 +70,7 @@ class InstanceManager {
|
|||
// dtsShader.currentOpacity = instance.gameObject.currentOpacity;
|
||||
// minfo.transparencymeshbatch.shadersChanged = true;
|
||||
// }
|
||||
var transform = instance.emptyObj.getAbsPos().clone();
|
||||
var transform = instance.emptyObj.getAbsPos();
|
||||
minfo.transparencymeshbatch.setTransform(transform);
|
||||
minfo.transparencymeshbatch.emitInstance();
|
||||
}
|
||||
|
|
@ -89,7 +91,7 @@ class InstanceManager {
|
|||
if (isInstanced(object)) {
|
||||
// Add existing instance
|
||||
var objs = getAllChildren(object);
|
||||
var minfos = objects.get(object.identifier);
|
||||
var minfos = objects[objectMap.get(object.identifier)]; // objects.get(object.identifier);
|
||||
for (i in 0...objs.length) {
|
||||
minfos[i].instances.push({emptyObj: objs[i], gameObject: object});
|
||||
}
|
||||
|
|
@ -129,13 +131,15 @@ class InstanceManager {
|
|||
}
|
||||
minfos.push(minfo);
|
||||
}
|
||||
objects.set(object.identifier, minfos);
|
||||
var curidx = objects.length;
|
||||
objects.push(minfos);
|
||||
objectMap.set(object.identifier, curidx);
|
||||
}
|
||||
}
|
||||
|
||||
public function getObjectBounds(object:GameObject) {
|
||||
if (isInstanced(object)) {
|
||||
var minfos = objects.get(object.identifier);
|
||||
var minfos = objects[objectMap.get(object.identifier)];
|
||||
var invmat = minfos[0].instances[0].gameObject.getInvPos();
|
||||
var b = minfos[0].instances[0].gameObject.getBounds().clone();
|
||||
b.transform(invmat);
|
||||
|
|
@ -149,7 +153,7 @@ class InstanceManager {
|
|||
}
|
||||
|
||||
public function isInstanced(object:GameObject) {
|
||||
if (objects.exists(object.identifier))
|
||||
if (objectMap.exists(object.identifier))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -269,7 +269,8 @@ class ParticleEmitter {
|
|||
}
|
||||
|
||||
class ParticleManager {
|
||||
var particlebatches:Map<String, ParticleBatch> = new Map();
|
||||
var particlebatches:Array<ParticleBatch> = [];
|
||||
var particlebatchMap:Map<String, Int> = [];
|
||||
var level:MarbleWorld;
|
||||
var scene:Scene;
|
||||
var currentTime:Float;
|
||||
|
|
@ -283,12 +284,12 @@ class ParticleManager {
|
|||
|
||||
public function update(currentTime:Float, dt:Float) {
|
||||
this.currentTime = currentTime;
|
||||
for (obj => batch in particlebatches) {
|
||||
for (batch in particlebatches) {
|
||||
for (instance in batch.instances)
|
||||
instance.update(currentTime, dt);
|
||||
}
|
||||
this.tick(dt);
|
||||
for (obj => batch in particlebatches) {
|
||||
for (batch in particlebatches) {
|
||||
batch.meshBatch.begin(batch.instances.length);
|
||||
for (instance in batch.instances) {
|
||||
if (instance.currentAge != 0) {
|
||||
|
|
@ -310,8 +311,8 @@ class ParticleManager {
|
|||
}
|
||||
|
||||
public function addParticle(particleData:ParticleData, particle:Particle) {
|
||||
if (particlebatches.exists(particleData.identifier)) {
|
||||
particlebatches.get(particleData.identifier).instances.push(particle);
|
||||
if (particlebatchMap.exists(particleData.identifier)) {
|
||||
particlebatches[particlebatchMap.get(particleData.identifier)].instances.push(particle);
|
||||
} else {
|
||||
var pts = [
|
||||
new Point(-0.5, -0.5, 0),
|
||||
|
|
@ -343,13 +344,15 @@ class ParticleManager {
|
|||
instances: [particle],
|
||||
meshBatch: mb
|
||||
};
|
||||
particlebatches.set(particleData.identifier, batch);
|
||||
var curidx = particlebatches.length;
|
||||
particlebatches.push(batch);
|
||||
particlebatchMap.set(particleData.identifier, curidx);
|
||||
}
|
||||
}
|
||||
|
||||
public function removeParticle(particleData:ParticleData, particle:Particle) {
|
||||
if (particlebatches.exists(particleData.identifier)) {
|
||||
particlebatches.get(particleData.identifier).instances.remove(particle);
|
||||
if (particlebatchMap.exists(particleData.identifier)) {
|
||||
particlebatches[particlebatchMap.get(particleData.identifier)].instances.remove(particle);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,9 @@ class ResourceLoader {
|
|||
// static var threadPool:FixedThreadPool = new FixedThreadPool(4);
|
||||
|
||||
public static function init(scene2d:h2d.Scene, onLoadedFunc:Void->Void) {
|
||||
// hxd.res.Resource.LIVE_UPDATE = false; // Disable live update to save frames
|
||||
@:privateAccess hxd.res.Image.ENABLE_AUTO_WATCH = false;
|
||||
// @:privateAccess hxd.res.Sound.ENABLE_AUTO_WATCH = false;
|
||||
#if (js || android)
|
||||
var mfileSystem = ManifestBuilder.create("data");
|
||||
var mloader = new ManifestLoader(mfileSystem);
|
||||
|
|
@ -140,6 +143,7 @@ class ResourceLoader {
|
|||
return audioCache.get(path);
|
||||
if (fileSystem.exists(path)) {
|
||||
var snd = loader.load(path).toSound();
|
||||
// @:privateAccess snd.watchCallb();
|
||||
var audioresource = new Resource(snd, path, audioCache, snd -> snd.dispose());
|
||||
audioCache.set(path, audioresource);
|
||||
return audioresource;
|
||||
|
|
|
|||
|
|
@ -88,11 +88,22 @@ class CollisionWorld {
|
|||
return contacts;
|
||||
}
|
||||
|
||||
public function rayCast(rayStart:Vector, rayDirection:Vector) {
|
||||
public function rayCast(rayStart:Vector, rayDirection:Vector, rayLength:Float) {
|
||||
// return [];
|
||||
rayStart.w = 1;
|
||||
rayDirection.w = 1;
|
||||
return this.octree.raycast(rayStart, rayDirection);
|
||||
var bounds = new Bounds();
|
||||
bounds.addPos(rayStart.x, rayStart.y, rayStart.z);
|
||||
bounds.addPos(rayStart.x
|
||||
+ rayDirection.x * rayLength, rayStart.y
|
||||
+ rayDirection.y * rayLength, rayStart.z
|
||||
+ rayDirection.z * rayLength);
|
||||
var objs = this.octree.boundingSearch(bounds).map(x -> cast(x, CollisionEntity));
|
||||
var results = [];
|
||||
for (obj in objs) {
|
||||
results = results.concat(obj.rayCast(rayStart, rayDirection));
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
public function addEntity(entity:CollisionEntity) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue