Skip to content

Commit 52ef169

Browse files
committed
Added a create entity to ecs native module
1 parent 730bf73 commit 52ef169

3 files changed

Lines changed: 53 additions & 18 deletions

File tree

benchmark/script_performance.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
#include "../test/mocklogger.h"
2020

21+
#include "2D/position.h"
22+
2123
namespace pg
2224
{
2325
namespace benchmark
@@ -156,6 +158,8 @@ namespace pg
156158
for (int count : smallCounts)
157159
{
158160
EntitySystem ecs("bench_native");
161+
ecs.createSystem<PositionComponentSystem>();
162+
159163
VM vm;
160164
ecs.setupVm(vm);
161165

src/Engine/ECS/ecsnativemodule.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ namespace pg
1313
*
1414
* Provides native functions for working with the ECS from scripts:
1515
*
16+
* - createEntity(name?): Create a new entity with an optional name, returns entity table
1617
* - removeEntity(entityId or entityInstance): Remove an entity from the ECS
1718
* - getEntity(entityId): Get entity data as a table
1819
* - getEntities(componentName): Get all entities with the specified component as a table of entity tables
@@ -400,6 +401,36 @@ namespace pg
400401
throw std::runtime_error("removeEntity expects an integer id or an entity instance");
401402
});
402403

404+
addNativeFunction("createEntity", [ecsRefCopy](VM* vm, int argCount, Value* args) -> Value {
405+
if (argCount > 1)
406+
{
407+
throw std::runtime_error("createEntity expects 0 or 1 arguments (optional entity name)");
408+
}
409+
410+
EntityRef entityRef;
411+
412+
if (argCount == 1)
413+
{
414+
if (not IS_STRING(args[0]))
415+
{
416+
throw std::runtime_error("createEntity expects entity name to be a string");
417+
}
418+
419+
auto entityName = vm->asString(args[0]);
420+
entityRef = ecsRefCopy->createEntity(entityName);
421+
422+
LOG_MILE("Ecs Compiled Module", "Created entity with name '" << entityName << "' and id " << entityRef->id);
423+
}
424+
else
425+
{
426+
entityRef = ecsRefCopy->createEntity();
427+
LOG_MILE("Ecs Compiled Module", "Created entity with id " << entityRef->id);
428+
}
429+
430+
// Return the serialized entity table (similar to getEntity)
431+
return serializeEntityToTable(vm, ecsRefCopy, entityRef.entity);
432+
});
433+
403434
addNativeFunction("getEntity", [ecsRefCopy](VM* vm, int argCount, Value* args) -> Value {
404435
if (argCount != 1)
405436
{

test/bench/bench_06_native_metamethod.pg

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,30 @@
22
// This tests the performance of calling native __get/__set from C++
33
// Create some test entities to use real component proxies
44

5-
// import "ecs"
5+
import "ecs"
66
// import "sys"
77

88
// // Create test entities with PositionComponent
99
// // var count = 2000
1010

11-
// for (var i = 0; i < count; i = i + 1)
12-
// {
13-
// var entity = ecs.createEntity()
14-
// entity.attachComp("Position", 100, 200, 0, 50, 50, 0, true, true)
15-
// }
11+
for (var i = 0; i < count; i = i + 1)
12+
{
13+
var entity = createEntity()
14+
entity.attachComp("Position", 100, 200, 0, 50, 50, 0, true, true)
15+
}
1616

17-
// // Benchmark: iterate using sys.getEntities (returns proxies)
18-
// var entities = sys.getEntities("Position")
17+
// Benchmark: iterate using sys.getEntities (returns proxies)
18+
var entities = getEntities("Position")
1919

20-
// for (var entity : entities)
21-
// {
22-
// var pos = entity.PositionComponent
20+
for (var entity : entities)
21+
{
22+
var pos = entity.PositionComponent
2323

24-
// // Read properties via native __get
25-
// var x = pos.x
26-
// var y = pos.y
24+
// Read properties via native __get
25+
var x = pos.x
26+
var y = pos.y
2727

28-
// // Write properties via native __set
29-
// pos.x = x + 1
30-
// pos.y = y + 1
31-
// }
28+
// Write properties via native __set
29+
pos.x = x + 1
30+
pos.y = y + 1
31+
}

0 commit comments

Comments
 (0)