improve performance of a lot of things

This commit is contained in:
RandomityGuy 2022-08-15 00:14:23 +05:30
parent b2cd2d63a3
commit b8df31324b
6 changed files with 50 additions and 28 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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;
}

View file

@ -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);
}
}

View file

@ -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;

View file

@ -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) {