rngine 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/README.md +150 -0
- package/Rngine.podspec +29 -0
- package/android/CMakeLists.txt +31 -0
- package/android/build.gradle +118 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/cpp/GameLoopJNI.cpp +31 -0
- package/android/src/main/cpp/cpp-adapter.cpp +11 -0
- package/android/src/main/java/com/margelo/nitro/rngine/GameEngine.kt +34 -0
- package/android/src/main/java/com/margelo/nitro/rngine/GameView.kt +63 -0
- package/android/src/main/java/com/margelo/nitro/rngine/Rect.kt +9 -0
- package/android/src/main/java/com/margelo/nitro/rngine/RectSerializer.kt +23 -0
- package/android/src/main/java/com/margelo/nitro/rngine/RnginePackage.kt +29 -0
- package/ios/Rngine.swift +28 -0
- package/lib/module/GameEngine.js +15 -0
- package/lib/module/GameEngine.js.map +1 -0
- package/lib/module/GameEngine.nitro.js +4 -0
- package/lib/module/GameEngine.nitro.js.map +1 -0
- package/lib/module/GameMethods.js +44 -0
- package/lib/module/GameMethods.js.map +1 -0
- package/lib/module/GameMethods.nitro.js +4 -0
- package/lib/module/GameMethods.nitro.js.map +1 -0
- package/lib/module/index.js +6 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/GameEngine.d.ts +13 -0
- package/lib/typescript/src/GameEngine.d.ts.map +1 -0
- package/lib/typescript/src/GameEngine.nitro.d.ts +7 -0
- package/lib/typescript/src/GameEngine.nitro.d.ts.map +1 -0
- package/lib/typescript/src/GameMethods.d.ts +16 -0
- package/lib/typescript/src/GameMethods.d.ts.map +1 -0
- package/lib/typescript/src/GameMethods.nitro.d.ts +18 -0
- package/lib/typescript/src/GameMethods.nitro.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +4 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +48 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/nitro.json +33 -0
- package/nitrogen/generated/android/c++/JHybridGameEngineSpec.cpp +49 -0
- package/nitrogen/generated/android/c++/JHybridGameEngineSpec.hpp +63 -0
- package/nitrogen/generated/android/c++/views/JHybridGameEngineStateUpdater.cpp +53 -0
- package/nitrogen/generated/android/c++/views/JHybridGameEngineStateUpdater.hpp +49 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngine/HybridGameEngineSpec.kt +53 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngine/rngineOnLoad.kt +35 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngine/views/HybridGameEngineManager.kt +80 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngine/views/HybridGameEngineStateUpdater.kt +23 -0
- package/nitrogen/generated/android/rngine+autolinking.cmake +84 -0
- package/nitrogen/generated/android/rngine+autolinking.gradle +27 -0
- package/nitrogen/generated/android/rngineOnLoad.cpp +66 -0
- package/nitrogen/generated/android/rngineOnLoad.hpp +34 -0
- package/nitrogen/generated/ios/Rngine+autolinking.rb +62 -0
- package/nitrogen/generated/ios/Rngine-Swift-Cxx-Bridge.cpp +33 -0
- package/nitrogen/generated/ios/Rngine-Swift-Cxx-Bridge.hpp +40 -0
- package/nitrogen/generated/ios/Rngine-Swift-Cxx-Umbrella.hpp +41 -0
- package/nitrogen/generated/ios/RngineAutolinking.mm +43 -0
- package/nitrogen/generated/ios/RngineAutolinking.swift +26 -0
- package/nitrogen/generated/ios/c++/HybridGameEngineSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridGameEngineSpecSwift.hpp +75 -0
- package/nitrogen/generated/ios/c++/views/HybridGameEngineComponent.mm +118 -0
- package/nitrogen/generated/ios/swift/HybridGameEngineSpec.swift +55 -0
- package/nitrogen/generated/ios/swift/HybridGameEngineSpec_cxx.swift +147 -0
- package/nitrogen/generated/shared/c++/Entity.hpp +111 -0
- package/nitrogen/generated/shared/c++/HybridGameEngineSpec.cpp +21 -0
- package/nitrogen/generated/shared/c++/HybridGameEngineSpec.hpp +62 -0
- package/nitrogen/generated/shared/c++/HybridGameMethodsSpec.cpp +30 -0
- package/nitrogen/generated/shared/c++/HybridGameMethodsSpec.hpp +80 -0
- package/nitrogen/generated/shared/c++/System.hpp +91 -0
- package/nitrogen/generated/shared/c++/World.hpp +91 -0
- package/nitrogen/generated/shared/c++/views/HybridGameEngineComponent.cpp +72 -0
- package/nitrogen/generated/shared/c++/views/HybridGameEngineComponent.hpp +109 -0
- package/nitrogen/generated/shared/json/GameEngineConfig.json +9 -0
- package/package.json +180 -0
- package/src/GameEngine.nitro.ts +10 -0
- package/src/GameEngine.tsx +17 -0
- package/src/GameMethods.nitro.ts +18 -0
- package/src/GameMethods.ts +46 -0
- package/src/index.tsx +21 -0
- package/src/types.ts +50 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import GameEngine from "./GameEngine.js";
|
|
4
|
+
import { configure, pause, resume, spawn, despawn, setPosition, setVelocity } from "./GameMethods.js";
|
|
5
|
+
export { GameEngine, configure, pause, resume, spawn, despawn, setPosition, setVelocity };
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["GameEngine","configure","pause","resume","spawn","despawn","setPosition","setVelocity"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,UAAU,MAAM,iBAAc;AACrC,SACEC,SAAS,EACTC,KAAK,EACLC,MAAM,EACNC,KAAK,EACLC,OAAO,EACPC,WAAW,EACXC,WAAW,QACN,kBAAe;AAEtB,SACEP,UAAU,EACVC,SAAS,EACTC,KAAK,EACLC,MAAM,EACNC,KAAK,EACLC,OAAO,EACPC,WAAW,EACXC,WAAW","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { GameEngineMethods, GameEngineProps } from './GameEngine.nitro';
|
|
2
|
+
/**
|
|
3
|
+
* A game engine view component that renders the game world.
|
|
4
|
+
* Size it using the style prop like any other React Native view.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* <GameEngine style={{ flex: 1 }} />
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
declare const _default: import("react-native-nitro-modules").ReactNativeView<GameEngineProps, GameEngineMethods>;
|
|
12
|
+
export default _default;
|
|
13
|
+
//# sourceMappingURL=GameEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GameEngine.d.ts","sourceRoot":"","sources":["../../../src/GameEngine.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE7E;;;;;;;;GAQG;;AACH,wBAGE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { HybridView, HybridViewMethods, HybridViewProps } from 'react-native-nitro-modules';
|
|
2
|
+
export interface GameEngineProps extends HybridViewProps {
|
|
3
|
+
}
|
|
4
|
+
export interface GameEngineMethods extends HybridViewMethods {
|
|
5
|
+
}
|
|
6
|
+
export type GameEngine = HybridView<GameEngineProps, GameEngineMethods>;
|
|
7
|
+
//# sourceMappingURL=GameEngine.nitro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GameEngine.nitro.d.ts","sourceRoot":"","sources":["../../../src/GameEngine.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EACjB,eAAe,EAChB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,eAAgB,SAAQ,eAAe;CAAG;AAC3D,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;CAAG;AAE/D,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Config, Entity } from './types';
|
|
2
|
+
/** Sets up the game engine with the given configuration. Call this before anything else. */
|
|
3
|
+
export declare function configure({ tickRate, world, entities, systems, paused, }: Config): void;
|
|
4
|
+
/** Pauses the game loop. Systems will stop running. */
|
|
5
|
+
export declare const pause: () => void;
|
|
6
|
+
/** Resumes the game loop. */
|
|
7
|
+
export declare const resume: () => void;
|
|
8
|
+
/** Spawns one or more entities into the world. Skips duplicates by id. */
|
|
9
|
+
export declare const spawn: (entities: Entity | Entity[]) => void;
|
|
10
|
+
/** Removes an entity or all entities matching the given id prefix from the world. */
|
|
11
|
+
export declare const despawn: (id: string) => void;
|
|
12
|
+
/** Sets the position of the entity with the exact given id. */
|
|
13
|
+
export declare const setPosition: (id: string, px: number, py: number) => void;
|
|
14
|
+
/** Sets the velocity of all entities matching the given id or prefix. */
|
|
15
|
+
export declare const setVelocity: (id: string, vx: number, vy: number) => void;
|
|
16
|
+
//# sourceMappingURL=GameMethods.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GameMethods.d.ts","sourceRoot":"","sources":["../../../src/GameMethods.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAI9C,4FAA4F;AAC5F,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,KAAK,EACL,QAAa,EACb,OAAY,EACZ,MAAa,GACd,EAAE,MAAM,QAUR;AAED,uDAAuD;AACvD,eAAO,MAAM,KAAK,YAA4B,CAAC;AAE/C,6BAA6B;AAC7B,eAAO,MAAM,MAAM,YAA6B,CAAC;AAEjD,0EAA0E;AAC1E,eAAO,MAAM,KAAK,GAAI,UAAU,MAAM,GAAG,MAAM,EAAE,SAEhD,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,OAAO,GAAI,IAAI,MAAM,SAA4B,CAAC;AAE/D,+DAA+D;AAC/D,eAAO,MAAM,WAAW,GAAI,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,SAChC,CAAC;AAE/B,yEAAyE;AACzE,eAAO,MAAM,WAAW,GAAI,IAAI,MAAM,EAAE,IAAI,MAAM,EAAE,IAAI,MAAM,SAChC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { HybridObject } from 'react-native-nitro-modules';
|
|
2
|
+
import type { Entity, System, World } from './types';
|
|
3
|
+
export interface GameMethods extends HybridObject<{
|
|
4
|
+
ios: 'c++';
|
|
5
|
+
android: 'c++';
|
|
6
|
+
}> {
|
|
7
|
+
setTickRate(tickRate: number): void;
|
|
8
|
+
setWorld(world: World): void;
|
|
9
|
+
setEntities(entities: Entity[]): void;
|
|
10
|
+
setSystems(systems: System[]): void;
|
|
11
|
+
pause(): void;
|
|
12
|
+
resume(): void;
|
|
13
|
+
spawn(entities: Entity[]): void;
|
|
14
|
+
despawn(id: string): void;
|
|
15
|
+
setP(id: string, px: number, py: number): void;
|
|
16
|
+
setV(id: string, vx: number, vy: number): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=GameMethods.nitro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GameMethods.nitro.d.ts","sourceRoot":"","sources":["../../../src/GameMethods.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErD,MAAM,WAAW,WAAY,SAAQ,YAAY,CAAC;IAChD,GAAG,EAAE,KAAK,CAAC;IACX,OAAO,EAAE,KAAK,CAAC;CAChB,CAAC;IACA,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACtC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACpC,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAChD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,EACL,SAAS,EACT,KAAK,EACL,MAAM,EACN,KAAK,EACL,OAAO,EACP,WAAW,EACX,WAAW,EACZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,UAAU,EACV,SAAS,EACT,KAAK,EACL,MAAM,EACN,KAAK,EACL,OAAO,EACP,WAAW,EACX,WAAW,GACZ,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export type World = {
|
|
2
|
+
/** Width of the world in game units. */
|
|
3
|
+
width: number;
|
|
4
|
+
/** Height of the world in game units. */
|
|
5
|
+
height: number;
|
|
6
|
+
/** Background color of the world as a hex string e.g. `'#1a1a1a'`. */
|
|
7
|
+
color: string;
|
|
8
|
+
};
|
|
9
|
+
export type Entity = {
|
|
10
|
+
/** Unique identifier. Use `_` as a separator for group queries e.g. `'enemy_1'`. */
|
|
11
|
+
id: string;
|
|
12
|
+
/** X position in game units. */
|
|
13
|
+
px: number;
|
|
14
|
+
/** Y position in game units. */
|
|
15
|
+
py: number;
|
|
16
|
+
/** Width in game units. */
|
|
17
|
+
width: number;
|
|
18
|
+
/** Height in game units. */
|
|
19
|
+
height: number;
|
|
20
|
+
/** Fill color as a hex string e.g. `'#00ff00'`. */
|
|
21
|
+
color: string;
|
|
22
|
+
/** Velocity on the X axis in game units per second. */
|
|
23
|
+
vx: number;
|
|
24
|
+
/** Velocity on the Y axis in game units per second. */
|
|
25
|
+
vy: number;
|
|
26
|
+
};
|
|
27
|
+
export type System = {
|
|
28
|
+
/** Entity ids or prefixes this system subscribes to. */
|
|
29
|
+
ids: string[];
|
|
30
|
+
/** Called every tick with the resolved entities. */
|
|
31
|
+
onTick: (entities: Entity[]) => void;
|
|
32
|
+
};
|
|
33
|
+
export type Config = {
|
|
34
|
+
/** Number of game logic updates per second. */
|
|
35
|
+
tickRate: number;
|
|
36
|
+
/** World dimensions and background color. */
|
|
37
|
+
world: World;
|
|
38
|
+
/** Initial entities to spawn. */
|
|
39
|
+
entities?: Entity[];
|
|
40
|
+
/**
|
|
41
|
+
* Systems that define the game logic. Each system runs every tick
|
|
42
|
+
* and receives the entities matching its ids.
|
|
43
|
+
*/
|
|
44
|
+
systems?: System[];
|
|
45
|
+
/** Whether to start paused. Defaults to true. */
|
|
46
|
+
paused?: boolean;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG;IAClB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,oFAAoF;IACpF,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAC;IACX,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,wDAAwD;IACxD,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,oDAAoD;IACpD,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,KAAK,EAAE,KAAK,CAAC;IACb,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,iDAAiD;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC"}
|
package/nitro.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cxxNamespace": ["rngine"],
|
|
3
|
+
"ios": {
|
|
4
|
+
"iosModuleName": "Rngine"
|
|
5
|
+
},
|
|
6
|
+
"android": {
|
|
7
|
+
"androidNamespace": ["rngine"],
|
|
8
|
+
"androidCxxLibName": "rngine"
|
|
9
|
+
},
|
|
10
|
+
"autolinking": {
|
|
11
|
+
"GameEngine": {
|
|
12
|
+
"ios": {
|
|
13
|
+
"language": "swift",
|
|
14
|
+
"implementationClassName": "GameEngine"
|
|
15
|
+
},
|
|
16
|
+
"android": {
|
|
17
|
+
"language": "kotlin",
|
|
18
|
+
"implementationClassName": "GameEngine"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"GameMethods": {
|
|
22
|
+
"ios": {
|
|
23
|
+
"language": "c++",
|
|
24
|
+
"implementationClassName": "GameMethods"
|
|
25
|
+
},
|
|
26
|
+
"android": {
|
|
27
|
+
"language": "c++",
|
|
28
|
+
"implementationClassName": "GameMethods"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"ignorePaths": ["node_modules"]
|
|
33
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// JHybridGameEngineSpec.cpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#include "JHybridGameEngineSpec.hpp"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
namespace margelo::nitro::rngine {
|
|
15
|
+
|
|
16
|
+
std::shared_ptr<JHybridGameEngineSpec> JHybridGameEngineSpec::JavaPart::getJHybridGameEngineSpec() {
|
|
17
|
+
auto hybridObject = JHybridObject::JavaPart::getJHybridObject();
|
|
18
|
+
auto castHybridObject = std::dynamic_pointer_cast<JHybridGameEngineSpec>(hybridObject);
|
|
19
|
+
if (castHybridObject == nullptr) [[unlikely]] {
|
|
20
|
+
throw std::runtime_error("Failed to downcast JHybridObject to JHybridGameEngineSpec!");
|
|
21
|
+
}
|
|
22
|
+
return castHybridObject;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
jni::local_ref<JHybridGameEngineSpec::CxxPart::jhybriddata> JHybridGameEngineSpec::CxxPart::initHybrid(jni::alias_ref<jhybridobject> jThis) {
|
|
26
|
+
return makeCxxInstance(jThis);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
std::shared_ptr<JHybridObject> JHybridGameEngineSpec::CxxPart::createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) {
|
|
30
|
+
auto castJavaPart = jni::dynamic_ref_cast<JHybridGameEngineSpec::JavaPart>(javaPart);
|
|
31
|
+
if (castJavaPart == nullptr) [[unlikely]] {
|
|
32
|
+
throw std::runtime_error("Failed to cast JHybridObject::JavaPart to JHybridGameEngineSpec::JavaPart!");
|
|
33
|
+
}
|
|
34
|
+
return std::make_shared<JHybridGameEngineSpec>(castJavaPart);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
void JHybridGameEngineSpec::CxxPart::registerNatives() {
|
|
38
|
+
registerHybrid({
|
|
39
|
+
makeNativeMethod("initHybrid", JHybridGameEngineSpec::CxxPart::initHybrid),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Properties
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
// Methods
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
} // namespace margelo::nitro::rngine
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// HybridGameEngineSpec.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <NitroModules/JHybridObject.hpp>
|
|
11
|
+
#include <fbjni/fbjni.h>
|
|
12
|
+
#include "HybridGameEngineSpec.hpp"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
namespace margelo::nitro::rngine {
|
|
18
|
+
|
|
19
|
+
using namespace facebook;
|
|
20
|
+
|
|
21
|
+
class JHybridGameEngineSpec: public virtual HybridGameEngineSpec, public virtual JHybridObject {
|
|
22
|
+
public:
|
|
23
|
+
struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::JavaPart> {
|
|
24
|
+
static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rngine/HybridGameEngineSpec;";
|
|
25
|
+
std::shared_ptr<JHybridGameEngineSpec> getJHybridGameEngineSpec();
|
|
26
|
+
};
|
|
27
|
+
struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxPart> {
|
|
28
|
+
static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rngine/HybridGameEngineSpec$CxxPart;";
|
|
29
|
+
static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
|
|
30
|
+
static void registerNatives();
|
|
31
|
+
using HybridBase::HybridBase;
|
|
32
|
+
protected:
|
|
33
|
+
std::shared_ptr<JHybridObject> createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) override;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
public:
|
|
37
|
+
explicit JHybridGameEngineSpec(const jni::local_ref<JHybridGameEngineSpec::JavaPart>& javaPart):
|
|
38
|
+
HybridObject(HybridGameEngineSpec::TAG),
|
|
39
|
+
JHybridObject(javaPart),
|
|
40
|
+
_javaPart(jni::make_global(javaPart)) {}
|
|
41
|
+
~JHybridGameEngineSpec() override {
|
|
42
|
+
// Hermes GC can destroy JS objects on a non-JNI Thread.
|
|
43
|
+
jni::ThreadScope::WithClassLoader([&] { _javaPart.reset(); });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public:
|
|
47
|
+
inline const jni::global_ref<JHybridGameEngineSpec::JavaPart>& getJavaPart() const noexcept {
|
|
48
|
+
return _javaPart;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public:
|
|
52
|
+
// Properties
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
public:
|
|
56
|
+
// Methods
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
private:
|
|
60
|
+
jni::global_ref<JHybridGameEngineSpec::JavaPart> _javaPart;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
} // namespace margelo::nitro::rngine
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// JHybridGameEngineStateUpdater.cpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#include "JHybridGameEngineStateUpdater.hpp"
|
|
9
|
+
#include "views/HybridGameEngineComponent.hpp"
|
|
10
|
+
#include <NitroModules/NitroDefines.hpp>
|
|
11
|
+
#include <react/fabric/StateWrapperImpl.h>
|
|
12
|
+
|
|
13
|
+
namespace margelo::nitro::rngine::views {
|
|
14
|
+
|
|
15
|
+
using namespace facebook;
|
|
16
|
+
using ConcreteStateData = react::ConcreteState<HybridGameEngineState>;
|
|
17
|
+
|
|
18
|
+
void JHybridGameEngineStateUpdater::updateViewProps(jni::alias_ref<jni::JClass> /* class */,
|
|
19
|
+
jni::alias_ref<JHybridGameEngineSpec::JavaPart> javaView,
|
|
20
|
+
jni::alias_ref<JStateWrapper::javaobject> stateWrapperInterface) {
|
|
21
|
+
std::shared_ptr<JHybridGameEngineSpec> hybridView = javaView->getJHybridGameEngineSpec();
|
|
22
|
+
|
|
23
|
+
// Get concrete StateWrapperImpl from passed StateWrapper interface object
|
|
24
|
+
jobject rawStateWrapper = stateWrapperInterface.get();
|
|
25
|
+
if (!stateWrapperInterface->isInstanceOf(react::StateWrapperImpl::javaClassStatic())) [[unlikely]] {
|
|
26
|
+
throw std::runtime_error("StateWrapper is not a StateWrapperImpl");
|
|
27
|
+
}
|
|
28
|
+
auto stateWrapper = jni::alias_ref<react::StateWrapperImpl::javaobject>{
|
|
29
|
+
static_cast<react::StateWrapperImpl::javaobject>(rawStateWrapper)};
|
|
30
|
+
std::shared_ptr<const react::State> state = stateWrapper->cthis()->getState();
|
|
31
|
+
auto concreteState = std::static_pointer_cast<const ConcreteStateData>(state);
|
|
32
|
+
const HybridGameEngineState& data = concreteState->getData();
|
|
33
|
+
const std::shared_ptr<HybridGameEngineProps>& props = data.getProps();
|
|
34
|
+
if (props == nullptr) [[unlikely]] {
|
|
35
|
+
// Props aren't set yet!
|
|
36
|
+
throw std::runtime_error("HybridGameEngineState's data doesn't contain any props!");
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Update all props if they are dirty
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
// Update hybridRef if it changed
|
|
43
|
+
if (props->hybridRef.isDirty) {
|
|
44
|
+
// hybridRef changed - call it with new this
|
|
45
|
+
const auto& maybeFunc = props->hybridRef.value;
|
|
46
|
+
if (maybeFunc.has_value()) {
|
|
47
|
+
maybeFunc.value()(hybridView);
|
|
48
|
+
}
|
|
49
|
+
props->hybridRef.isDirty = false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
} // namespace margelo::nitro::rngine::views
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// JHybridGameEngineStateUpdater.hpp
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#ifndef RN_SERIALIZABLE_STATE
|
|
11
|
+
#error rngine was compiled without the 'RN_SERIALIZABLE_STATE' flag. This flag is required for Nitro Views - set it in your CMakeLists!
|
|
12
|
+
#endif
|
|
13
|
+
|
|
14
|
+
#include <fbjni/fbjni.h>
|
|
15
|
+
#include <react/fabric/CoreComponentsRegistry.h>
|
|
16
|
+
#include <react/fabric/StateWrapperImpl.h>
|
|
17
|
+
#include <react/renderer/core/ConcreteComponentDescriptor.h>
|
|
18
|
+
#include <NitroModules/NitroDefines.hpp>
|
|
19
|
+
#include <NitroModules/JStateWrapper.hpp>
|
|
20
|
+
#include "JHybridGameEngineSpec.hpp"
|
|
21
|
+
#include "views/HybridGameEngineComponent.hpp"
|
|
22
|
+
|
|
23
|
+
namespace margelo::nitro::rngine::views {
|
|
24
|
+
|
|
25
|
+
using namespace facebook;
|
|
26
|
+
|
|
27
|
+
class JHybridGameEngineStateUpdater final: public jni::JavaClass<JHybridGameEngineStateUpdater> {
|
|
28
|
+
public:
|
|
29
|
+
static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/rngine/views/HybridGameEngineStateUpdater;";
|
|
30
|
+
|
|
31
|
+
public:
|
|
32
|
+
static void updateViewProps(jni::alias_ref<jni::JClass> /* class */,
|
|
33
|
+
jni::alias_ref<JHybridGameEngineSpec::JavaPart> view,
|
|
34
|
+
jni::alias_ref<JStateWrapper::javaobject> stateWrapperInterface);
|
|
35
|
+
|
|
36
|
+
public:
|
|
37
|
+
static void registerNatives() {
|
|
38
|
+
// Register JNI calls
|
|
39
|
+
javaClassStatic()->registerNatives({
|
|
40
|
+
makeNativeMethod("updateViewProps", JHybridGameEngineStateUpdater::updateViewProps),
|
|
41
|
+
});
|
|
42
|
+
// Register React Native view component descriptor
|
|
43
|
+
auto provider = react::concreteComponentDescriptorProvider<HybridGameEngineComponentDescriptor>();
|
|
44
|
+
auto providerRegistry = react::CoreComponentsRegistry::sharedProviderRegistry();
|
|
45
|
+
providerRegistry->add(provider);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
} // namespace margelo::nitro::rngine::views
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// HybridGameEngineSpec.kt
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
package com.margelo.nitro.rngine
|
|
9
|
+
|
|
10
|
+
import androidx.annotation.Keep
|
|
11
|
+
import com.facebook.jni.HybridData
|
|
12
|
+
import com.facebook.proguard.annotations.DoNotStrip
|
|
13
|
+
import com.margelo.nitro.core.HybridObject
|
|
14
|
+
import com.margelo.nitro.views.HybridView
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A Kotlin class representing the GameEngine HybridObject.
|
|
18
|
+
* Implement this abstract class to create Kotlin-based instances of GameEngine.
|
|
19
|
+
*/
|
|
20
|
+
@DoNotStrip
|
|
21
|
+
@Keep
|
|
22
|
+
@Suppress(
|
|
23
|
+
"KotlinJniMissingFunction", "unused",
|
|
24
|
+
"RedundantSuppression", "RedundantUnitReturnType", "SimpleRedundantLet",
|
|
25
|
+
"LocalVariableName", "PropertyName", "PrivatePropertyName", "FunctionName"
|
|
26
|
+
)
|
|
27
|
+
abstract class HybridGameEngineSpec: HybridView() {
|
|
28
|
+
// Properties
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
// Methods
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
// Default implementation of `HybridObject.toString()`
|
|
35
|
+
override fun toString(): String {
|
|
36
|
+
return "[HybridObject GameEngine]"
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// C++ backing class
|
|
40
|
+
@DoNotStrip
|
|
41
|
+
@Keep
|
|
42
|
+
protected open class CxxPart(javaPart: HybridGameEngineSpec): HybridObject.CxxPart(javaPart) {
|
|
43
|
+
// C++ JHybridGameEngineSpec::CxxPart::initHybrid(...)
|
|
44
|
+
external override fun initHybrid(): HybridData
|
|
45
|
+
}
|
|
46
|
+
override fun createCxxPart(): CxxPart {
|
|
47
|
+
return CxxPart(this)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
companion object {
|
|
51
|
+
protected const val TAG = "HybridGameEngineSpec"
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// rngineOnLoad.kt
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
package com.margelo.nitro.rngine
|
|
9
|
+
|
|
10
|
+
import android.util.Log
|
|
11
|
+
|
|
12
|
+
internal class rngineOnLoad {
|
|
13
|
+
companion object {
|
|
14
|
+
private const val TAG = "rngineOnLoad"
|
|
15
|
+
private var didLoad = false
|
|
16
|
+
/**
|
|
17
|
+
* Initializes the native part of "rngine".
|
|
18
|
+
* This method is idempotent and can be called more than once.
|
|
19
|
+
*/
|
|
20
|
+
@JvmStatic
|
|
21
|
+
fun initializeNative() {
|
|
22
|
+
if (didLoad) return
|
|
23
|
+
try {
|
|
24
|
+
Log.i(TAG, "Loading rngine C++ library...")
|
|
25
|
+
System.loadLibrary("rngine")
|
|
26
|
+
Log.i(TAG, "Successfully loaded rngine C++ library!")
|
|
27
|
+
didLoad = true
|
|
28
|
+
} catch (e: Error) {
|
|
29
|
+
Log.e(TAG, "Failed to load rngine C++ library! Is it properly installed and linked? " +
|
|
30
|
+
"Is the name correct? (see `CMakeLists.txt`, at `add_library(...)`)", e)
|
|
31
|
+
throw e
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngine/views/HybridGameEngineManager.kt
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// HybridGameEngineManager.kt
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
package com.margelo.nitro.rngine.views
|
|
9
|
+
|
|
10
|
+
import android.view.View
|
|
11
|
+
import com.facebook.react.uimanager.ReactStylesDiffMap
|
|
12
|
+
import com.facebook.react.uimanager.SimpleViewManager
|
|
13
|
+
import com.facebook.react.uimanager.StateWrapper
|
|
14
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
15
|
+
import com.margelo.nitro.R.id.associated_hybrid_view_tag
|
|
16
|
+
import com.margelo.nitro.views.RecyclableView
|
|
17
|
+
import com.margelo.nitro.rngine.*
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Represents the React Native `ViewManager` for the "GameEngine" Nitro HybridView.
|
|
21
|
+
*/
|
|
22
|
+
public class HybridGameEngineManager: SimpleViewManager<View>() {
|
|
23
|
+
init {
|
|
24
|
+
if (RecyclableView::class.java.isAssignableFrom(GameEngine::class.java)) {
|
|
25
|
+
// Enable view recycling
|
|
26
|
+
super.setupViewRecycling()
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
override fun getName(): String {
|
|
31
|
+
return "GameEngine"
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
override fun createViewInstance(reactContext: ThemedReactContext): View {
|
|
35
|
+
val hybridView = GameEngine(reactContext)
|
|
36
|
+
val view = hybridView.view
|
|
37
|
+
view.setTag(associated_hybrid_view_tag, hybridView)
|
|
38
|
+
return view
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
override fun updateState(view: View, props: ReactStylesDiffMap, stateWrapper: StateWrapper): Any? {
|
|
42
|
+
val hybridView = getHybridView(view)
|
|
43
|
+
?: throw Error("Couldn't find view $view in local views table!")
|
|
44
|
+
|
|
45
|
+
// 1. Update each prop individually
|
|
46
|
+
hybridView.beforeUpdate()
|
|
47
|
+
HybridGameEngineStateUpdater.updateViewProps(hybridView, stateWrapper)
|
|
48
|
+
hybridView.afterUpdate()
|
|
49
|
+
|
|
50
|
+
// 2. Continue in base View props
|
|
51
|
+
return super.updateState(view, props, stateWrapper)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
override fun onDropViewInstance(view: View) {
|
|
55
|
+
val hybridView = getHybridView(view)
|
|
56
|
+
hybridView?.onDropView()
|
|
57
|
+
return super.onDropViewInstance(view)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
protected override fun prepareToRecycleView(reactContext: ThemedReactContext, view: View): View? {
|
|
61
|
+
super.prepareToRecycleView(reactContext, view)
|
|
62
|
+
val hybridView = getHybridView(view)
|
|
63
|
+
?: return null
|
|
64
|
+
|
|
65
|
+
@Suppress("USELESS_IS_CHECK")
|
|
66
|
+
if (hybridView is RecyclableView) {
|
|
67
|
+
// Recycle in it's implementation
|
|
68
|
+
hybridView.prepareForRecycle()
|
|
69
|
+
|
|
70
|
+
// Maybe update the view if it changed
|
|
71
|
+
return hybridView.view
|
|
72
|
+
} else {
|
|
73
|
+
return null
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private fun getHybridView(view: View): GameEngine? {
|
|
78
|
+
return view.getTag(associated_hybrid_view_tag) as? GameEngine
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
///
|
|
2
|
+
/// HybridGameEngineStateUpdater.kt
|
|
3
|
+
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
|
|
4
|
+
/// https://github.com/mrousavy/nitro
|
|
5
|
+
/// Copyright © Marc Rousavy @ Margelo
|
|
6
|
+
///
|
|
7
|
+
|
|
8
|
+
package com.margelo.nitro.rngine.views
|
|
9
|
+
|
|
10
|
+
import com.facebook.react.uimanager.StateWrapper
|
|
11
|
+
import com.margelo.nitro.rngine.*
|
|
12
|
+
|
|
13
|
+
internal class HybridGameEngineStateUpdater {
|
|
14
|
+
companion object {
|
|
15
|
+
/**
|
|
16
|
+
* Updates the props for [view] through C++.
|
|
17
|
+
* The [state] prop is expected to contain [view]'s props as wrapped Fabric state.
|
|
18
|
+
*/
|
|
19
|
+
@Suppress("KotlinJniMissingFunction")
|
|
20
|
+
@JvmStatic
|
|
21
|
+
external fun updateViewProps(view: HybridGameEngineSpec, state: StateWrapper)
|
|
22
|
+
}
|
|
23
|
+
}
|