ok - so loading ok again - now will get rid of editor and games as concrete objects - they become entities

beta.r3js.org
-=yb4f310 2017-05-11 13:30:20 +02:00
parent 4d828ee849
commit b29cb12bee
4 changed files with 305 additions and 95 deletions

View File

@ -482,17 +482,57 @@ GameLib.D3.Editor.prototype.setSize = function(width, height) {
*/
GameLib.D3.Editor.prototype.addScene = function(scene) {
if (scene instanceof GameLib.D3.Scene) {
this.scenes.push(scene);
this.buildIdToObject();
return;
if (!scene instanceof GameLib.D3.Scene &&
!scene instanceof GameLib.D3.API.Scene) {
throw new Error('Unhandled scene type : ' + scene);
}
if (scene instanceof GameLib.D3.API.Scene) {
scene = new GameLib.D3.Scene(this.graphics, scene);
this.scenes.push(scene);
this.buildIdToObject();
}
scene = new GameLib.D3.Scene(this.graphics, scene);
this.scenes.push(scene);
this.buildIdToObject();
/**
* We need to add the meshes as components of this scene to the entity 'editor' of the 'entityManager' in this.
*
* We need a notify mechanism to notify the system of new mesh components
*/
scene.meshes.map(
function(mesh){
/**
* Get all entities with 3D renderers and some systems
*/
var entities = this.entityManager.query(
[
GameLib.D3.Renderer,
GameLib.System
]
);
entities.map(
function(entity){
/**
* Add all meshes to this entity
*/
entity.addComponent(mesh);
/**
* Now we need to notify all systems of this new components
*/
var systems = entity.getComponent(GameLib.System);
systems.map(
function(system){
system.notify('meshes', GameLib.D3.Mesh)
}.bind(this)
)
}.bind(this)
);
}.bind(this)
);
throw new Error('Unhandled scene type : ' + scene);
};

View File

@ -85,7 +85,32 @@ GameLib.EntityManager.prototype.createEntity = function(name) {
};
/**
* Removes an entity
* Adds an entity to this manager
* @param entity
*/
GameLib.EntityManager.prototype.addEntity = function(entity) {
this.entities.push(entity);
};
/**
* Returns entity by name
* @param name
* @returns {*}
*/
GameLib.EntityManager.prototype.queryByName = function(name) {
return this.entities.reduce(
function(result, entity){
if (entity.name === name) {
result = entity;
}
return result;
},
null
)
};
/**
* Removes an entity - do we remove all its components as well?
* @param entity GameLib.D3.Entity
* @returns boolean true if successful
*/
@ -93,7 +118,7 @@ GameLib.EntityManager.prototype.removeEntity = function(entity) {
var index = this.entities.indexOf(entity);
if (index == -1) {
if (index === -1) {
console.log('failed to remove entity : ', entity);
return false;
}
@ -103,71 +128,122 @@ GameLib.EntityManager.prototype.removeEntity = function(entity) {
};
/**
* Returns all the objects with the following components
* Returns all the entities with the following components
* @param components GameLib.Component[]
*/
GameLib.EntityManager.prototype.query = function(components) {
var result = this.entities.reduce(
function(__queryComponents) {
return function(result, entity) {
var entities = this.entities.reduce(
function(result, entity) {
var results = __queryComponents.reduce(
function(__entity) {
return function(componentResult, queryComponent) {
var components = __entity.components.reduce(
function(__queryComponent) {
return function(__components, entityComponent) {
if (__queryComponent == entityComponent.constructor) {
// arrow should point towards a window or sergej --->
__components[entityComponent.id] = entityComponent;
}
return __components;
}
}(queryComponent),
{}
);
for (var property in components) {
if (components.hasOwnProperty(property)) {
componentResult[property] = components[property];
}
}
return componentResult;
}
}(entity),
{}
);
for (var property in results) {
if (results.hasOwnProperty(property)) {
result[property] = results[property];
var hasAllComponents = components.reduce(
function(componentResult, component) {
if (!entity.hasComponent(component)) {
componentResult = false;
}
}
return result;
return componentResult;
},
true
);
if (hasAllComponents) {
result.push(entity);
}
}(components),
{}
return result;
},
[]
);
var array = [];
return entities;
for (var property in result) {
if (result.hasOwnProperty(property)) {
array.push(result[property]);
}
}
// var result = this.entities.reduce(
//
// function(__queryComponents) {
//
// return function(result, entity) {
//
// var results = __queryComponents.reduce(
//
// function(__entity) {
//
// return function(componentResult, queryComponent) {
//
// var components = __entity.components.reduce(
//
// function(__queryComponent) {
//
// return function(__components, entityComponent) {
//
// if (__queryComponent === entityComponent.constructor) {
// // arrow should point towards a window or sergej --->
// __components[entityComponent.id] = entityComponent;
// }
//
// return __components;
//
// }
// }(queryComponent),
// {}
// );
//
// for (var property in components) {
// if (components.hasOwnProperty(property)) {
// componentResult[property] = components[property];
// }
// }
//
// return componentResult;
// }
// }(entity),
// {}
//
// );
//
// for (var property in results) {
// if (results.hasOwnProperty(property)) {
// result[property] = results[property];
// }
// }
//
// return result;
//
// }
// }(components),
// {}
// );
//
// var array = [];
//
// for (var property in result) {
// if (result.hasOwnProperty(property)) {
// array.push(result[property]);
// }
// }
//
// return array;
};
return array;
/**
* Returns all actual components of all entities that contain this component
* @param constructor
*/
GameLib.EntityManager.prototype.queryComponents = function(constructor) {
var entities = this.query([constructor]);
var components = entities.reduce(
function(result, entity){
var ecs = entity.getComponent(constructor);
ecs.map(function(ec){
result.push(ec);
});
return result;
},
[]
);
return components;
};
/**

View File

@ -102,16 +102,64 @@ GameLib.Entity.prototype.createInstance = function() {
* Adds a component to this entity through the instance (should notify the entity manager instance)
* @param component
*/
GameLib.Entity.prototype.addComponent = function() {
if (this.componentToCreate == GameLib.Component.COMPONENT_CUSTOM_CODE) {
var component = new GameLib.D3.CustomCode();
}
GameLib.Entity.prototype.addComponent = function(component) {
this.components.push(component);
component.parentEntity = this;
};
/**
* Returns all components of type 'constructor'
* @param constructor
*/
GameLib.Entity.prototype.getComponent = function(constructor) {
var components = this.components.reduce(
function(result, component) {
if (component instanceof constructor) {
result.push(component);
}
return result;
},
[]
);
return components;
};
/**
* Returns the first component or null
* @param constructor
*/
GameLib.Entity.prototype.getFirstComponent = function(constructor) {
var components = this.getComponent(constructor);
if (components.length > 0) {
return components[0];
}
return null;
};
/**
* Returns true when this entity has a certain component, false otherwise
* @param constructor
*/
GameLib.Entity.prototype.hasComponent = function(constructor) {
var has = this.components.reduce(
function(result, component) {
if (component instanceof constructor) {
result = true;
}
return result;
},
false
);
return has;
};
/**
*
* @param component
@ -122,7 +170,7 @@ GameLib.Entity.prototype.removeComponent = function(component) {
var index = this.components.indexOf(component);
if (index == -1) {
if (index === -1) {
console.log('failed to remove component : ', component);
return false;
}

View File

@ -60,7 +60,7 @@ GameLib.System.SYSTEM_TYPE_ALL = 0x7;
GameLib.System.prototype.start = function() {
if (this.systemType === GameLib.System.SYSTEM_TYPE_INPUT) {
this.driveInputObjects = this.entityManager.query([GameLib.D3.Input.Drive]);
// this.driveInputObjects = this.entityManager.query([GameLib.D3.Input.Drive]);
}
if (this.systemType === GameLib.System.SYSTEM_TYPE_RENDER) {
@ -76,25 +76,36 @@ GameLib.System.prototype.start = function() {
//this.domElement.instance.appendChild(this.domStats.instance);
}
this.renderers = this.entityManager.query([GameLib.D3.Renderer]);
this.renderers = this.entityManager.queryComponents(GameLib.D3.Renderer);
this.renderers.forEach(
function (renderer) {
renderer.domElement.instance.appendChild(renderer.instance.domElement);
}.bind(this)
);
this.viewports = this.entityManager.query([GameLib.D3.Viewport]);
this.renderEntities = this.entityManager.query(
[
GameLib.D3.Viewport,
GameLib.D3.Scene,
GameLib.D3.Renderer,
GameLib.D3.Camera
]
);
}
if (this.systemType === GameLib.System.SYSTEM_TYPE_ANIMATION) {
this.pathFollowingObjects = this.entityManager.query([GameLib.D3.PathFollowing]);
this.followObjects = this.entityManager.query([GameLib.D3.Follow]);
this.meshObjects = this.entityManager.query([GameLib.D3.Mesh]);
this.lookAtObjects = this.entityManager.query([GameLib.D3.LookAt]);
this.cameraObjects = this.entityManager.query([GameLib.D3.Camera]);
this.lightObjects = this.entityManager.query([GameLib.D3.Light]);
// this.pathFollowingObjects = this.entityManager.query([GameLib.D3.PathFollowing]);
// this.followObjects = this.entityManager.query([GameLib.D3.Follow]);
// this.meshObjects = this.entityManager.query([GameLib.D3.Mesh]);
// this.lookAtObjects = this.entityManager.query([GameLib.D3.LookAt]);
// this.cameraObjects = this.entityManager.query([GameLib.D3.Camera]);
// this.lightObjects = this.entityManager.query([GameLib.D3.Light]);
}
this.update();
};
/**
@ -151,11 +162,32 @@ GameLib.System.prototype.update = function(deltaTime) {
}
if (this.systemType === GameLib.System.SYSTEM_TYPE_RENDER) {
this.viewports.forEach(
function (viewport) {
viewport.update(deltaTime);
}
);
this.renderEntities.map(
function(renderEntity) {
var renderer = renderEntity.getFirstComponent(GameLib.D3.Renderer);
var camera = renderEntity.getFirstComponent(GameLib.D3.Camera);
var viewport = renderEntity.getFirstComponent(GameLib.D3.Viewport);
renderer.instance.setViewport(
viewport.x,
viewport.y,
viewport.width,
viewport.height
);
var scenes = renderEntity.getComponent(GameLib.D3.Scene);
scenes.map(function(scene){
renderer.instance.render(
scene.instance,
camera.instance
);
});
}
);
}
};
@ -167,22 +199,23 @@ GameLib.System.prototype.update = function(deltaTime) {
GameLib.System.prototype.stop = function() {
if (this.systemType === GameLib.System.SYSTEM_TYPE_INPUT) {
this.driveInputObjects = [];
// this.driveInputObjects = [];
}
if (this.systemType === GameLib.System.SYSTEM_TYPE_RENDER) {
this.domElement.innerHTML = 'Rendering System Stopped';
this.renderers = [];
this.viewports = [];
this.renderers = [];
this.viewports = [];
this.meshes = [];
}
if (this.systemType === GameLib.System.SYSTEM_TYPE_ANIMATION) {
this.pathFollowingObjects = [];
this.followObjects = [];
this.meshObjects = [];
this.lookAtObjects = [];
this.cameraObjects = [];
this.lightObjects = [];
// this.pathFollowingObjects = [];
// this.followObjects = [];
// this.meshObjects = [];
// this.lookAtObjects = [];
// this.cameraObjects = [];
// this.lightObjects = [];
}
};
@ -213,3 +246,16 @@ GameLib.System.prototype.toApiSystem = function() {
GameLib.Utils.IdOrNull(this.parentEntity)
);
};
GameLib.System.prototype.notify = function(property, constructor) {
this[property] = this.entityManager.queryComponents(constructor);
/**
* For meshes, we need to notify all scene objects
*/
if (constructor === GameLib.D3.Mesh) {
}
};