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.
Files changed (81) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +150 -0
  3. package/Rngine.podspec +29 -0
  4. package/android/CMakeLists.txt +31 -0
  5. package/android/build.gradle +118 -0
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/cpp/GameLoopJNI.cpp +31 -0
  8. package/android/src/main/cpp/cpp-adapter.cpp +11 -0
  9. package/android/src/main/java/com/margelo/nitro/rngine/GameEngine.kt +34 -0
  10. package/android/src/main/java/com/margelo/nitro/rngine/GameView.kt +63 -0
  11. package/android/src/main/java/com/margelo/nitro/rngine/Rect.kt +9 -0
  12. package/android/src/main/java/com/margelo/nitro/rngine/RectSerializer.kt +23 -0
  13. package/android/src/main/java/com/margelo/nitro/rngine/RnginePackage.kt +29 -0
  14. package/ios/Rngine.swift +28 -0
  15. package/lib/module/GameEngine.js +15 -0
  16. package/lib/module/GameEngine.js.map +1 -0
  17. package/lib/module/GameEngine.nitro.js +4 -0
  18. package/lib/module/GameEngine.nitro.js.map +1 -0
  19. package/lib/module/GameMethods.js +44 -0
  20. package/lib/module/GameMethods.js.map +1 -0
  21. package/lib/module/GameMethods.nitro.js +4 -0
  22. package/lib/module/GameMethods.nitro.js.map +1 -0
  23. package/lib/module/index.js +6 -0
  24. package/lib/module/index.js.map +1 -0
  25. package/lib/module/package.json +1 -0
  26. package/lib/module/types.js +2 -0
  27. package/lib/module/types.js.map +1 -0
  28. package/lib/typescript/package.json +1 -0
  29. package/lib/typescript/src/GameEngine.d.ts +13 -0
  30. package/lib/typescript/src/GameEngine.d.ts.map +1 -0
  31. package/lib/typescript/src/GameEngine.nitro.d.ts +7 -0
  32. package/lib/typescript/src/GameEngine.nitro.d.ts.map +1 -0
  33. package/lib/typescript/src/GameMethods.d.ts +16 -0
  34. package/lib/typescript/src/GameMethods.d.ts.map +1 -0
  35. package/lib/typescript/src/GameMethods.nitro.d.ts +18 -0
  36. package/lib/typescript/src/GameMethods.nitro.d.ts.map +1 -0
  37. package/lib/typescript/src/index.d.ts +4 -0
  38. package/lib/typescript/src/index.d.ts.map +1 -0
  39. package/lib/typescript/src/types.d.ts +48 -0
  40. package/lib/typescript/src/types.d.ts.map +1 -0
  41. package/nitro.json +33 -0
  42. package/nitrogen/generated/android/c++/JHybridGameEngineSpec.cpp +49 -0
  43. package/nitrogen/generated/android/c++/JHybridGameEngineSpec.hpp +63 -0
  44. package/nitrogen/generated/android/c++/views/JHybridGameEngineStateUpdater.cpp +53 -0
  45. package/nitrogen/generated/android/c++/views/JHybridGameEngineStateUpdater.hpp +49 -0
  46. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngine/HybridGameEngineSpec.kt +53 -0
  47. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngine/rngineOnLoad.kt +35 -0
  48. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngine/views/HybridGameEngineManager.kt +80 -0
  49. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngine/views/HybridGameEngineStateUpdater.kt +23 -0
  50. package/nitrogen/generated/android/rngine+autolinking.cmake +84 -0
  51. package/nitrogen/generated/android/rngine+autolinking.gradle +27 -0
  52. package/nitrogen/generated/android/rngineOnLoad.cpp +66 -0
  53. package/nitrogen/generated/android/rngineOnLoad.hpp +34 -0
  54. package/nitrogen/generated/ios/Rngine+autolinking.rb +62 -0
  55. package/nitrogen/generated/ios/Rngine-Swift-Cxx-Bridge.cpp +33 -0
  56. package/nitrogen/generated/ios/Rngine-Swift-Cxx-Bridge.hpp +40 -0
  57. package/nitrogen/generated/ios/Rngine-Swift-Cxx-Umbrella.hpp +41 -0
  58. package/nitrogen/generated/ios/RngineAutolinking.mm +43 -0
  59. package/nitrogen/generated/ios/RngineAutolinking.swift +26 -0
  60. package/nitrogen/generated/ios/c++/HybridGameEngineSpecSwift.cpp +11 -0
  61. package/nitrogen/generated/ios/c++/HybridGameEngineSpecSwift.hpp +75 -0
  62. package/nitrogen/generated/ios/c++/views/HybridGameEngineComponent.mm +118 -0
  63. package/nitrogen/generated/ios/swift/HybridGameEngineSpec.swift +55 -0
  64. package/nitrogen/generated/ios/swift/HybridGameEngineSpec_cxx.swift +147 -0
  65. package/nitrogen/generated/shared/c++/Entity.hpp +111 -0
  66. package/nitrogen/generated/shared/c++/HybridGameEngineSpec.cpp +21 -0
  67. package/nitrogen/generated/shared/c++/HybridGameEngineSpec.hpp +62 -0
  68. package/nitrogen/generated/shared/c++/HybridGameMethodsSpec.cpp +30 -0
  69. package/nitrogen/generated/shared/c++/HybridGameMethodsSpec.hpp +80 -0
  70. package/nitrogen/generated/shared/c++/System.hpp +91 -0
  71. package/nitrogen/generated/shared/c++/World.hpp +91 -0
  72. package/nitrogen/generated/shared/c++/views/HybridGameEngineComponent.cpp +72 -0
  73. package/nitrogen/generated/shared/c++/views/HybridGameEngineComponent.hpp +109 -0
  74. package/nitrogen/generated/shared/json/GameEngineConfig.json +9 -0
  75. package/package.json +180 -0
  76. package/src/GameEngine.nitro.ts +10 -0
  77. package/src/GameEngine.tsx +17 -0
  78. package/src/GameMethods.nitro.ts +18 -0
  79. package/src/GameMethods.ts +46 -0
  80. package/src/index.tsx +21 -0
  81. 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,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=types.js.map
@@ -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,4 @@
1
+ import GameEngine from './GameEngine';
2
+ import { configure, pause, resume, spawn, despawn, setPosition, setVelocity } from './GameMethods';
3
+ export { GameEngine, configure, pause, resume, spawn, despawn, setPosition, setVelocity, };
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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
+ }
@@ -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
+ }