跳转至

C++

main.cpp中AppMain为程序运行主入口

例如:

    extern "C" void AppMain(){
        cout << "helllo world" << endl;
        uint32_t asset = forge::AssetRegisterVoxModel("Main Scene", "", "mainScene", false);
        forge::AssetSetStartCBFunc(asset, OnStart);
        forge::AssetSetInterpolateCBFunc(asset, OnInterpolate);
        forge::AssetSetUpdateCBFunc(asset, OnUpdate);
        forge::AssetSetKeyCBFunc(asset, OnKey);
        forge::AssetSetMouseButtonCBFunc(asset, OnMouseButton);

        uint32_t ROBOT_ASSET = forge::AssetRegisterMob("robot", "robot/icon.png", "robot/skeleton.ozz", "robot/mesh.ozz", "robot/texture.png", "robot/Take 001.ozz");
        forge::AssetSetStartCBFunc(ROBOT_ASSET, OnRobotStart);
    }

注册资源

例如:

uint32_t asset = forge::AssetRegisterVoxModel("Main Scene", "", "mainScene", false);
uint32_t ROBOT_ASSET = forge::AssetRegisterMob("robot", "robot/icon.png", "robot/skeleton.ozz", "robot/mesh.ozz", "robot/texture.png", "robot/Take 001.ozz");

相关生命周期函数(事件)回调

例如:

forge::AssetSetStartCBFunc(ROBOT_ASSET, OnRobotStart);
forge::AssetSetStartCBFunc(asset, OnStart);
forge::AssetSetInterpolateCBFunc(asset, OnInterpolate);
forge::AssetSetUpdateCBFunc(asset, OnUpdate);
forge::AssetSetKeyCBFunc(asset, OnKey);
forge::AssetSetMouseButtonCBFunc(asset, OnMouseButton);
注意:对同一资源的生命周期函数的设置只有1个生效,即
forge::AssetSetStartCBFunc(asset, OnStart);
forge::AssetSetStartCBFunc(asset, OnStart1);
只有forge::AssetSetStartCBFunc(asset, OnStart1)会执行

通过extern申请其他cpp文件中的函数

例如 在main.cpp中调用robot.app中的OnRobotStart函数 robot.cpp中:

static void OnRobotStart(uint32_t EntityID) {
    std::cout << "helllo world" << endl;
}
main.cpp中:
extern void OnRobotStart(uint32_t EntityID);

资源id获取与使用

例如:

#define GetMobID(EntityID) forge::EntityGetMobID(EntityID)
#define GetVoxModelID(EntityID) forge::EntityGetVoxModelID(EntityID)

static void OnRobotStart(uint32_t EntityID) {
    woxiao::MobGetPosition(GetMobID(EntityID),&x,&y,&z,&yaw,&pitch);
    woxiao::MobSetMotion(GetMobID(EntityID),woxiao::MOTION_FORWARD,1,0);
}

static void OnStart(uint32_t EntityID) {
    woxiao::SetBlock(GetVoxModelID(EntityID),0.0,25.0,0.0,woxiao::BLOCK_O);
}

角色资源动作

例如:

    woxiao::MobDoAction(GetMobID(EntityID),"action",1,true);
    woxiao::MobSetActionRange(GetMobID(EntityID),0.0/205,25.0/205);
注意:动作范围为浮点数

API

woxiao

namespace woxiao {

    enum {
        KEY_SPACE = 32,
        KEY_APOSTROPHE = 39,
        KEY_COMMA = 44,
        KEY_MINUS = 45,
        KEY_PERIOD = 46,
        KEY_SLASH = 47,
        KEY_K_0 = 48,
        KEY_K_1 = 49,
        KEY_K_2 = 50,
        KEY_K_3 = 51,
        KEY_K_4 = 52,
        KEY_K_5 = 53,
        KEY_K_6 = 54,
        KEY_K_7 = 55,
        KEY_K_8 = 56,
        KEY_K_9 = 57,
        KEY_SEMICOLON = 59,
        KEY_EQUAL = 61,
        KEY_A = 97,
        KEY_B = 98,
        KEY_C = 99,
        KEY_D = 100,
        KEY_E = 101,
        KEY_F = 102,
        KEY_G = 103,
        KEY_H = 104,
        KEY_I = 105,
        KEY_J = 106,
        KEY_K = 107,
        KEY_L = 108,
        KEY_M = 109,
        KEY_N = 110,
        KEY_O = 111,
        KEY_P = 112,
        KEY_Q = 113,
        KEY_R = 114,
        KEY_S = 115,
        KEY_T = 116,
        KEY_U = 117,
        KEY_V = 118,
        KEY_W = 119,
        KEY_X = 120,
        KEY_Y = 121,
        KEY_Z = 122,
        KEY_LEFT_BRACKET = 91,
        KEY_BACKSLASH = 92,
        KEY_RIGHT_BRACKET = 93,
        KEY_GRAVE_ACCENT = 96,
        KEY_ESCAPE = 27,
        KEY_ENTER = 13,
        KEY_TAB = 9,
        KEY_BACKSPACE = 8,
        KEY_INSERT = 1073741897,
        KEY_DELETE = 127,
        KEY_RIGHT = 1073741903,
        KEY_LEFT = 1073741904,
        KEY_DOWN = 1073741905,
        KEY_UP = 1073741906,
        KEY_PAGE_UP = 1073741899,
        KEY_PAGE_DOWN = 1073741902,
        KEY_HOME = 1073741898,
        KEY_END = 1073741901,
        KEY_CAPS_LOCK = 1073741881,
        KEY_SCROLL_LOCK = 1073741895,
        KEY_NUM_LOCK = 1073741907,
        KEY_PRINT_SCREEN = 1073741894,
        KEY_PAUSE = 1073741896,
        KEY_F1 = 1073741882,
        KEY_F2 = 1073741883,
        KEY_F3 = 1073741884,
        KEY_F4 = 1073741885,
        KEY_F5 = 1073741886,
        KEY_F6 = 1073741887,
        KEY_F7 = 1073741888,
        KEY_F8 = 1073741889,
        KEY_F9 = 1073741890,
        KEY_F10 = 1073741891,
        KEY_F11 = 1073741892,
        KEY_F12 = 1073741893,
        KEY_KP_0 = 1073741922,
        KEY_KP_1 = 1073741913,
        KEY_KP_2 = 1073741914,
        KEY_KP_3 = 1073741915,
        KEY_KP_4 = 1073741916,
        KEY_KP_5 = 1073741917,
        KEY_KP_6 = 1073741918,
        KEY_KP_7 = 1073741919,
        KEY_KP_8 = 1073741920,
        KEY_KP_9 = 1073741921,
        KEY_KP_DECIMAL = 1073742044,
        KEY_KP_DIVIDE = 1073741908,
        KEY_KP_MULTIPLY = 1073741909,
        KEY_KP_SUBTRACT = 1073741910,
        KEY_KP_ADD = 1073741911,
        KEY_KP_ENTER = 1073741912,
        KEY_LEFT_SHIFT = 1073742049,
        KEY_LEFT_CONTROL = 1073742048,
        KEY_LEFT_ALT = 1073742050,
        KEY_LEFT_SUPER = 1073742051,
        KEY_RIGHT_SHIFT = 1073742053,
        KEY_RIGHT_CONTROL = 1073742052,
        KEY_RIGHT_ALT = 1073742054,
        KEY_RIGHT_SUPER = 1073742055,
        KEY_MENU = 1073741942,
    };

    enum {
        MOUSEBUTTON_LEFT = 1,
        MOUSEBUTTON_RIGHT = 3,
        MOUSEBUTTON_MIDDLE = 2,
    };

    enum {
        ACTION_RELEASE = 0,
        ACTION_PRESS = 1,
        ACTION_REPEAT = 2,
    };

    enum {
        MOD_SHIFT = 1,
        MOD_CONTROL = 2,
        MOD_ALT = 4,
        MOD_SUPER = 8,
    };

    enum {
        MOTION_NONE = 0,
        MOTION_FORWARD = 1,
        MOTION_BACKWARD = 2,
        MOTION_STRAFE_LEFT = 4,
        MOTION_STRAFE_RIGHT = 8,
        MOTION_YAW_LEFT = 16,
        MOTION_YAW_RIGHT = 32,
        MOTION_PITCH_UP = 64,
        MOTION_PITCH_DOWN = 128,
        MOTION_JUMPING = 256,
        MOTION_CROUCHING = 512,
        MOTION_NO_GRAVITY = 1024,
        MOTION_CLIMB = 2048,
    };

    enum {
        VOXMODEL_TYPE_PROCEDURE_NOISE = 1,
        VOXMODEL_TYPE_MODEL = 3,
    };

    enum {
        BLOCK_AIR = 0,
        BLOCK_GRASS_BLOCK = 1,
        BLOCK_RED_SAND = 2,
        BLOCK_STONE_BRICKS = 3,
        BLOCK_BRICKS = 4,
        BLOCK_OAK_LOG = 5,
        BLOCK_STONE = 6,
        BLOCK_DIRT = 7,
        BLOCK_OAK_PLANKS = 8,
        BLOCK_COBBLESTONE = 11,
        BLOCK_WATER = 12,
        BLOCK_LAVA = 13,
        BLOCK_CHEST = 14,
        BLOCK_OAK_LEAVES = 15,
        BLOCK_CLOUD = 16,
        BLOCK_TALL_GRASS = 17,
        BLOCK_DANDELION = 18,
        BLOCK_POPPY = 19,
        BLOCK_RED_MUSHROOM = 21,
        BLOCK_BROWN_MUSHROOM = 22,
        BLOCK_DEAD_BUSH = 23,
        BLOCK_SPONGE = 24,
        BLOCK_MELON = 25,
        BLOCK_END_STONE = 26,
        BLOCK_TNT = 27,
        BLOCK_BLOCK_OF_EMERALD_OLD = 28,
        BLOCK_FERN = 29,
        BLOCK_BLACK_WOOL = 32,
        BLOCK_BLUE_WOOL = 33,
        BLOCK_BROWN_WOOL = 34,
        BLOCK_CYAN_WOOL = 35,
        BLOCK_GRAY_WOOL = 36,
        BLOCK_GREEN_WOOL = 37,
        BLOCK_LIGHT_BLUE_WOOL = 38,
        BLOCK_LIME_WOOL = 39,
        BLOCK_MAGENTA_WOOL = 40,
        BLOCK_ORANGE_WOOL = 41,
        BLOCK_PINK_WOOL = 42,
        BLOCK_PURPLE_WOOL = 43,
        BLOCK_RED_WOOL = 44,
        BLOCK_LIGHT_GRAY_WOOL = 45,
        BLOCK_WHITE_WOOL = 46,
        BLOCK_YELLOW_WOOL = 47,
        BLOCK_DIAMOND_ORE = 48,
        BLOCK_REDSTONE_ORE = 49,
        BLOCK_BOOKSHELF = 50,
        BLOCK_MOSSY_COBBLESTONE = 51,
        BLOCK_OBSIDIAN = 52,
        BLOCK_WORKBENCH = 53,
        BLOCK_FURNACE = 54,
        BLOCK_SNOW_BLOCK = 57,
        BLOCK_CLAY_BLOCK = 59,
        BLOCK_JUKEBOX = 60,
        BLOCK_CACTUS = 61,
        BLOCK_MYCELIUM = 62,
        BLOCK_NETHERRACK = 63,
        BLOCK_GLOWSTONE = 64,
        BLOCK_BEDROCK = 65,
        BLOCK_GRAVEL = 66,
        BLOCK_BLOCK_OF_IRON = 67,
        BLOCK_BLOCK_OF_GOLD = 68,
        BLOCK_BLOCK_OF_DIAMOND = 69,
        BLOCK_GOLD_ORE = 70,
        BLOCK_IRON_ORE = 71,
        BLOCK_COAL_ORE = 72,
        BLOCK_LAPIS_LAZULI_ORE = 73,
        BLOCK_LAPIS_LAZULI_BLOCK = 74,
        BLOCK_SANDSTONE = 75,
        BLOCK_MOSSY_STONE_BRICKS = 76,
        BLOCK_CRACKED_STONE_BRICKS = 77,
        BLOCK_JACK_O_LANTERN_OFF = 79,
        BLOCK_JACK_O_LANTERN_ON = 80,
        BLOCK_BROWN_MUSHROOM_BLOCK = 81,
        BLOCK_RED_MUSHROOM_BLOCK = 82,
        BLOCK_EMERALD_ORE = 84,
        BLOCK_SOUL_SAND = 85,
        BLOCK_NETHER_BRICKS = 86,
        BLOCK_DRY_FARMLAND = 87,
        BLOCK_WET_FARMLAND = 88,
        BLOCK_GRANITE = 91,
        BLOCK_POLISHED_GRANITE = 92,
        BLOCK_DIORITE = 93,
        BLOCK_POLISHED_DIORITE = 94,
        BLOCK_ANDESITE = 95,
        BLOCK_POLISHED_ANDESITE = 96,
        BLOCK_SMOOTH_RED_SANDSTONE = 97,
        BLOCK_CHISELED_RED_SANDSTONE = 98,
        BLOCK_RED_SANDSTONE = 99,
        BLOCK_SAND = 100,
        BLOCK_SMOOTH_SANDSTONE = 101,
        BLOCK_CHISELED_SANDSTONE = 102,
        BLOCK_BLOCK_OF_QUARTZ = 103,
        BLOCK_QUARTZ_PILLAR = 104,
        BLOCK_CHISELED_QUARTZ_BLOCK = 105,
        BLOCK_DOUBLE_STONE_SLAB = 106,
        BLOCK_END_STONE_BRICKS = 107,
        BLOCK_CHISELED_STONE_BRICKS = 108,
        BLOCK_PRISMARINE_BRICKS = 109,
        BLOCK_PRISMARINE = 110,
        BLOCK_DARK_PRISMARINE = 111,
        BLOCK_PURPUR_PILLAR = 112,
        BLOCK_PURPUR_BLOCK = 113,
        BLOCK_RED_NETHER_BRICKS = 114,
        BLOCK_BLOCK_OF_COAL = 115,
        BLOCK_DRAGON_EGG = 116,
        BLOCK_COARSE_DIRT = 117,
        BLOCK_PODZOL = 118,
        BLOCK_GRASS_PATH = 119,
        BLOCK_SNOW_GRASS = 120,
        BLOCK_WET_SPONGE = 121,
        BLOCK_NETHER_QUARTZ_ORE = 122,
        BLOCK_SEA_LANTERN = 123,
        BLOCK_HAY_BALE = 124,
        BLOCK_BONE_BLOCK = 125,
        BLOCK_NETHER_WART_BLOCK = 126,
        BLOCK_MAGMA_BLOCK = 127,
        BLOCK_BEACON = 128,
        BLOCK_WHEAT = 129,
        BLOCK_COBWEB = 130,
        BLOCK_REDSTONE_LAMP = 131,
        BLOCK_OXEYE_DAISY = 132,
        BLOCK_PEONY = 133,
        BLOCK_ORANGE_TULIP = 134,
        BLOCK_LILAC = 135,
        BLOCK_ROSE_BUSH = 136,
        BLOCK_WHITE_TULIP = 137,
        BLOCK_BLUE_ORCHID = 138,
        BLOCK_ALLIUM = 139,
        BLOCK_AZURE_BLUET = 140,
        BLOCK_IRON_BARS = 141,
        BLOCK_MUSHROOM_STEM = 142,
        BLOCK_CAULDRON = 143,
        BLOCK_SPRUCE_PLANKS = 144,
        BLOCK_BIRCH_PLANKS = 145,
        BLOCK_JUNGLE_PLANKS = 146,
        BLOCK_ACACIA_PLANKS = 147,
        BLOCK_DARK_OAK_PLANKS = 148,
        BLOCK_SPRUCE_LOG = 149,
        BLOCK_BIRCH_LOG = 150,
        BLOCK_JUNGLE_LOG = 151,
        BLOCK_ACACIA_LOG = 152,
        BLOCK_DARK_OAK_LOG = 153,
        BLOCK_SPRUCE_LEAVES = 154,
        BLOCK_BIRCH_LEAVES = 155,
        BLOCK_JUNGLE_LEAVES = 156,
        BLOCK_ACACIA_LEAVES = 157,
        BLOCK_DARK_OAK_LEAVES = 158,
        BLOCK_BLACK_CONCRETE = 159,
        BLOCK_BLUE_CONCRETE = 160,
        BLOCK_BROWN_CONCRETE = 161,
        BLOCK_CYAN_CONCRETE = 162,
        BLOCK_GRAY_CONCRETE = 163,
        BLOCK_GREEN_CONCRETE = 164,
        BLOCK_LIGHT_BLUE_CONCRETE = 165,
        BLOCK_LIME_CONCRETE = 166,
        BLOCK_MAGENTA_CONCRETE = 167,
        BLOCK_ORANGE_CONCRETE = 168,
        BLOCK_PINK_CONCRETE = 169,
        BLOCK_PURPLE_CONCRETE = 170,
        BLOCK_RED_CONCRETE = 171,
        BLOCK_LIGHT_GRAY_CONCRETE = 172,
        BLOCK_WHITE_CONCRETE = 173,
        BLOCK_YELLOW_CONCRETE = 174,
        BLOCK_BLACK_CONCRETE_POWDER = 175,
        BLOCK_BLUE_CONCRETE_POWDER = 176,
        BLOCK_BROWN_CONCRETE_POWDER = 177,
        BLOCK_CYAN_CONCRETE_POWDER = 178,
        BLOCK_GRAY_CONCRETE_POWDER = 179,
        BLOCK_GREEN_CONCRETE_POWDER = 180,
        BLOCK_LIGHT_BLUE_CONCRETE_POWDER = 181,
        BLOCK_LIME_CONCRETE_POWDER = 182,
        BLOCK_MAGENTA_CONCRETE_POWDER = 183,
        BLOCK_ORANGE_CONCRETE_POWDER = 184,
        BLOCK_PINK_CONCRETE_POWDER = 185,
        BLOCK_PURPLE_CONCRETE_POWDER = 186,
        BLOCK_RED_CONCRETE_POWDER = 187,
        BLOCK_LIGHT_GRAY_CONCRETE_POWDER = 188,
        BLOCK_WHITE_CONCRETE_POWDER = 189,
        BLOCK_YELLOW_CONCRETE_POWDER = 190,
        BLOCK_BLACK_SHULKER_BOX = 191,
        BLOCK_BLUE_SHULKER_BOX = 192,
        BLOCK_BROWN_SHULKER_BOX = 193,
        BLOCK_CYAN_SHULKER_BOX = 194,
        BLOCK_GRAY_SHULKER_BOX = 195,
        BLOCK_GREEN_SHULKER_BOX = 196,
        BLOCK_LIGHT_BLUE_SHULKER_BOX = 197,
        BLOCK_LIME_SHULKER_BOX = 198,
        BLOCK_MAGENTA_SHULKER_BOX = 199,
        BLOCK_ORANGE_SHULKER_BOX = 200,
        BLOCK_PINK_SHULKER_BOX = 201,
        BLOCK_PURPLE_SHULKER_BOX = 202,
        BLOCK_RED_SHULKER_BOX = 203,
        BLOCK_LIGHT_GRAY_SHULKER_BOX = 204,
        BLOCK_WHITE_SHULKER_BOX = 205,
        BLOCK_YELLOW_SHULKER_BOX = 206,
        BLOCK_BLACK_TERRACOTTA = 207,
        BLOCK_BLUE_TERRACOTTA = 208,
        BLOCK_BROWN_TERRACOTTA = 209,
        BLOCK_CYAN_TERRACOTTA = 210,
        BLOCK_GRAY_TERRACOTTA = 211,
        BLOCK_GREEN_TERRACOTTA = 212,
        BLOCK_LIGHT_BLUE_TERRACOTTA = 213,
        BLOCK_LIME_TERRACOTTA = 214,
        BLOCK_MAGENTA_TERRACOTTA = 215,
        BLOCK_ORANGE_TERRACOTTA = 216,
        BLOCK_PINK_TERRACOTTA = 217,
        BLOCK_PURPLE_TERRACOTTA = 218,
        BLOCK_RED_TERRACOTTA = 219,
        BLOCK_LIGHT_GRAY_TERRACOTTA = 220,
        BLOCK_WHITE_TERRACOTTA = 221,
        BLOCK_YELLOW_TERRACOTTA = 222,
        BLOCK_ENDER_CHEST = 223,
        BLOCK_DOG_FOOD = 224,
        BLOCK_POTATO = 225,
        BLOCK_CARROT = 226,
        BLOCK_TUBE_CORAL = 227,
        BLOCK_HORN_CORAL = 228,
        BLOCK_FIRE_CORAL = 229,
        BLOCK_WOODEN_BOX_01 = 230,
        BLOCK_WOODEN_BOX_02 = 231,
        BLOCK_SPEAKER_01 = 232,
        BLOCK_SPEAKER_02 = 233,
        BLOCK_GLASS = 234,
        BLOCK_BLUE_ICE = 235,
        BLOCK_BARREL = 236,
        BLOCK_LIME_GLAZED_TERRACOTTA = 237,
        BLOCK_RED_GLAZED_TERRACOTTA = 238,
        BLOCK_BLACK_GLAZED_TERRACOTTA = 239,
        BLOCK_WHITE_GLAZED_TERRACOTTA = 240,
        BLOCK_ORANGE_GLAZED_TERRACOTTA = 241,
        BLOCK_BLOCK_OF_EMERALD = 242,
        BLOCK_FRUIT_SAPLING = 243,
        BLOCK_DECORATIVE_PLANKS_01 = 244,
        BLOCK_DECORATIVE_PLANKS_02 = 245,
        BLOCK_DECORATIVE_PLANKS_03 = 246,
        BLOCK_ACACIA_DOOR_01 = 247,
        BLOCK_ACACIA_DOOR_02 = 248,
        BLOCK_BIRCH_DOOR_01 = 249,
        BLOCK_BIRCH_DOOR_02 = 250,
        BLOCK_TRAP_DOOR = 251,
        BLOCK_SPRUCE_DOOR_01 = 252,
        BLOCK_SPRUCE_DOOR_02 = 253,
        BLOCK_PISTON = 254,
        BLOCK_FENCE = 255,
        BLOCK_A = 256,
        BLOCK_B = 257,
        BLOCK_C = 258,
        BLOCK_D = 259,
        BLOCK_E = 260,
        BLOCK_F = 261,
        BLOCK_G = 262,
        BLOCK_H = 263,
        BLOCK_I = 264,
        BLOCK_J = 265,
        BLOCK_K = 266,
        BLOCK_L = 267,
        BLOCK_M = 268,
        BLOCK_N = 269,
        BLOCK_O = 270,
        BLOCK_P = 271,
        BLOCK_Q = 272,
        BLOCK_R = 273,
        BLOCK_S = 274,
        BLOCK_T = 275,
        BLOCK_U = 276,
        BLOCK_V = 277,
        BLOCK_W = 278,
        BLOCK_X = 279,
        BLOCK_Y = 280,
        BLOCK_Z = 281,
        BLOCK_ZERO = 282,
        BLOCK_ONE = 283,
        BLOCK_TWO = 284,
        BLOCK_THREE = 285,
        BLOCK_FOUR = 286,
        BLOCK_FIVE = 287,
        BLOCK_SIX = 288,
        BLOCK_SEVEN = 289,
        BLOCK_EIGHT = 290,
        BLOCK_NINE = 291,
        BLOCK_PLUS = 292,
        BLOCK_SUBTRACT = 293,
        BLOCK_MULTIPLY = 294,
        BLOCK_DIVIDE = 295,
    };

    WXAPI int  GetKey(int Key);

    WXAPI void PrintLog(const char* Text);

    WXAPI const char* GetUserProjectDir(void);

    WXAPI void SetBlock(uint32_t VMID, int x, int y, int z, int Sort);
    WXAPI void BuildTreeDefault(uint32_t VMID, int x, int y, int z);
    WXAPI void BuildCylinder(uint32_t VMID, int x, int y, int z, int Height, int Radius, int Sort, bool Fill);
    WXAPI void BuildByImage(uint32_t VMID, int x, int y, int z, int Highest, const char* File);
    WXAPI void BuildByGoxel(uint32_t VMID, int x, int y, int z, const char* File);
    WXAPI void BuildBySqliteAsync(uint32_t VMID, int x, int y, int z, const char* File);

    WXAPI bool BlockSortIsExist(int Sort);
    WXAPI int  BlockSortGetByColor(uint8_t Color[4], bool Exact);
    WXAPI int  BlockSortGetByName(const char* Name);
    WXAPI int  BlockSortGet(uint32_t VMId, int x, int y, int z);

    WXAPI int  GetHighest(int x, int z, uint32_t vmidExclude = -1);
    WXAPI int  GetHitBlockFromCamera(uint32_t* VMID, int* bx, int* by, int* bz, const float MaxDistance);
    WXAPI bool GetBuildPositionFromCamera(uint32_t* VMID, int* bx, int* by, int* bz, const float MaxDistance);

    WXAPI uint32_t VoxModelInsert(const char* Path, int Type, int OwnerId, bool Write);
    WXAPI bool VoxModelRemove(uint32_t VMID);
    WXAPI void VoxModelSetPostion(uint32_t VMID, float x, float y, float z, float yaw, float pitch);
    WXAPI void VoxModelGetPosition(uint32_t VMID, float* px, float* py, float* pz, float* pyaw, float* ppitch);
    WXAPI void VoxModelSetMotion(uint32_t VMID, int MotionFlag, float Speed, float AngularSpeed);

    WXAPI void SetDayTime(float Time, int DayLength);
    WXAPI void GetDayTime(float* Time, int* DayLength);
    WXAPI void LightingBlock(uint32_t VMID, int x, int y, int z, bool Lighting);
    WXAPI void FogSetDistantRatio(float Ratio);
    WXAPI void LoadSky(const char* File);

    WXAPI void CameraAttachMobJoint(uint32_t MobID, int Joint);
    WXAPI void CameraAttachVoxModel(uint32_t VMID);
    WXAPI void CameraSetPosition(float x, float y, float z, float yaw, float pitch);
    WXAPI void CameraGetPosition(float* px, float* py, float* pz, float* pyaw, float* ppitch);
    WXAPI bool CameraIsFlying(void);
    WXAPI void CameraSetFlying(bool Flying);

    WXAPI float GetFov(void);
    WXAPI void  SetFov(float Fov);

    WXAPI uint32_t MobCreate(const char* SkFilePath, int Height);
    WXAPI void MobDestroy(uint32_t MobID);
    WXAPI bool MobLoadAnimation(uint32_t MobID, const char* ActionName, const char* File);
    WXAPI bool MobLoadMesh(uint32_t MobID, const char* MeshName, const char* File);
    WXAPI bool MobLoadTexture(uint32_t MobID, const char* TextureName, const char* File);
    WXAPI void MobSetMotion(uint32_t MobID, int MotionFlag, int Speed, int AngularSpeed);
    WXAPI void MobSetPosition(uint32_t MobID, float x, float y, float z, float yaw, float pitch);
    WXAPI void MobGetPosition(uint32_t MobID, float* px, float* py, float* pz, float* pyaw, float* ppitch);
    WXAPI void MobDoAction(uint32_t MobID, const char* Name, float Speed, bool Loop);
    WXAPI void MobSetActionRange(uint32_t MobID, float Begin, float End);
    WXAPI void MobSetHidden(uint32_t MobID, bool Hidden);
    WXAPI void MobSetPause(uint32_t MobID, bool Pause);

    WXAPI bool MobCollidePoint(uint32_t MobID, const float P[4]);
    WXAPI void MobAttachVoxModel(uint32_t MobID, uint32_t VMID);
    WXAPI int  MobGetJoint(uint32_t MobID, const char* Name);
    WXAPI void MobAttachVoxMdel2Joint(uint32_t MobID, uint32_t VMID, int Joint);

    WXAPI void ParticleFountainEmit(float x, float y, float z);
    WXAPI void BreakBlockEffect(uint32_t VMId, int x, int y, int z, int Sort);

    WXAPI uint32_t AudioCreate(const char* File, bool ThreeDimensional);
    WXAPI void AudioDestroy(uint32_t AudioId);
    WXAPI bool AudioIsPlaying(uint32_t AudioId);
    WXAPI void AudioPlay(uint32_t AudioId, bool Loop);
    WXAPI void AudioStop(uint32_t AudioId);
    WXAPI void AudioStopAll(void);
    WXAPI void AudioSetPos(uint32_t AudioId, float x, float y, float z);
    WXAPI void AudioSetRolloffFactor(uint32_t AudioId, float Factor);
    WXAPI void AudioSetMinDistance(uint32_t AudioId, float Distance);
    WXAPI void AudioSetMaxDistance(uint32_t AudioId, float Distance);
    WXAPI void AudioSetGain(uint32_t AudioId, float Gain);
    WXAPI void AudioSetPitch(uint32_t AudioId, float Pitch);
    WXAPI void AudioListenerSetPos(float x, float y, float z);
    WXAPI void AudioListenerSetOri(float yaw, float pitch);
    WXAPI bool AudioCaptureIsRunning(void);
    WXAPI bool AudioCaptureStart(const char* File);
    WXAPI void AudioCaptureStop(void);

    WXAPI void ARInitialze(const char* ImgFile, float Multiple = 128.0f);

    typedef void(*OnAppInterpolate)(uint64_t FrameStamp, double DeltaTime);
    typedef void(*OnAppUpdate)(uint64_t FrameStamp, double DeltaTime);
    typedef bool(*OnAppKey)(uint64_t FrameStamp, int Key, int Scancode, int Action, int Mods);
    typedef bool(*OnAppMouseButton)(uint64_t FrameStamp, int Button, int Action, int Mods);

    WXAPI void AppSetCBInterpolate(OnAppInterpolate Func);
    WXAPI void AppSetCBUpdate(OnAppUpdate Func);
    WXAPI void AppSetCBKey(OnAppKey Func);
    WXAPI void AppSetCBMouseButton(OnAppMouseButton Func);

    typedef void(*OnResponse)(const char* Response);
    WXAPI bool UtilHttpGet(const char* URL, OnResponse ResponseFunc);
}

forge

namespace forge {

    WXAPI uint32_t AssetRegisterBlock(const char* Name, const char* IconFile, int BlockSort);
    WXAPI uint32_t AssetRegisterMob(const char* Name, const char* IconFile, const char* MobSkeleton,
        const char* MobMesh = NULL, const char* MobTexture = NULL, const char* MobAction = NULL,
        float ActionRangeMin = 0.0f, float ActionRangeMax = 1.0f);
    WXAPI uint32_t AssetRegisterVoxModel(const char* Name, const char* IconFile, const char* VoxModelPath, bool bWrite = false);

    typedef void(*OnAssetInteract)(uint32_t EntityID, int MouseButton);
    typedef void(*OnAssetStart)(uint32_t EntityID);
    typedef void(*OnAssetInterpolate)(uint32_t EntityID, uint64_t FrameStamp, double DeltaTime);
    typedef void(*OnAssetUpdate)(uint32_t EntityID, uint64_t FrameStamp, double DeltaTime);
    typedef bool(*OnAssetKey)(uint32_t EntityID, uint64_t FrameStamp, int Key, int Scancode, int Action, int Mods);
    typedef bool(*OnAssetMouseButton)(uint32_t EntityID, uint64_t FrameStamp, int Button, int Action, int Mods);

    WXAPI void AssetSetInteractCBFunc(uint32_t AssetID, OnAssetInteract InteractFunc);
    WXAPI void AssetSetStartCBFunc(uint32_t AssetID, OnAssetStart StartFunc);
    WXAPI void AssetSetInterpolateCBFunc(uint32_t AssetID, OnAssetInterpolate InterpolateFunc);
    WXAPI void AssetSetUpdateCBFunc(uint32_t AssetID, OnAssetUpdate UpdateFunc);
    WXAPI void AssetSetKeyCBFunc(uint32_t AssetID, OnAssetKey KeyFunc);
    WXAPI void AssetSetMouseButtonCBFunc(uint32_t AssetID, OnAssetMouseButton MouseButtonFunc);

    WXAPI uint32_t EntityGetMobID(uint32_t EntityID);
    WXAPI uint32_t EntityGetVoxModelID(uint32_t EntityID);

    typedef void(*OnCameraMove)(int MotionFlag, double DeltaTime);
    typedef void(*OnCameraRotate)(float DeltaYaw, double DeltaPitch);
    typedef void(*OnCameraToggleFlying)(void);

    WXAPI void SetCameraControl(OnCameraMove MoveFunc, OnCameraRotate RotateFunc, OnCameraToggleFlying ToggleFlyingFunc);
    WXAPI void SetCameraControlDefault(void);

    typedef void(*OnUIContinue)(void);
    typedef void(*OnUIQuestionAnswer)(int OptionIndex, const char* Option);
    typedef void(*OnUIInputAnswer)(const char* InputText);
    typedef void(*OnUIButtonClick)(void);

    WXAPI void ShowDialog(const char* Speaker, const char* Content, OnUIContinue ContinueFunc);
    WXAPI void ShowQuestionDialog(const char* Speaker, const char* Content, const char** Options, int NumOption, OnUIQuestionAnswer AnswerFunc);
    WXAPI void ShowInputDialog(const char* Speaker, const char* Content, OnUIInputAnswer AnswerFunc);
    WXAPI void ShowMessageBox(const char* Content, OnUIContinue ContinueFunc);
    WXAPI void ShowContactBook(void);
    WXAPI void ContactBookAddEntry(const char* Name, const char* Phone, const char* Age, const char* Address, const char* Remark);
    WXAPI void ContactBookClearEntries(void);
    WXAPI void ShowLetter(const char* Content);
    WXAPI void ShowInvitationCard(const char* Name, const char* Address);
    WXAPI void ShowSubtitles(const char* Subtitles);
    WXAPI void CloseSubtitles(void);
    WXAPI void ShowCover(const char* ImageFile, const char* Title, const char* Author, const char* Text);
    WXAPI void CloseCover(void);
    WXAPI void ShowCountdown(int CountDown);
    WXAPI void AddQuickButton(const char* Label, OnUIButtonClick ClickFunc);

}