358 lines
6.7 KiB
C++
358 lines
6.7 KiB
C++
#include "bbsys.hpp"
|
|
#include <vector>
|
|
|
|
#include <gxinput.hpp>
|
|
#include <gxdevice.hpp>
|
|
|
|
gxInput* gx_input;
|
|
gxDevice* gx_mouse;
|
|
gxDevice* gx_keyboard;
|
|
std::vector<gxDevice*> gx_joysticks;
|
|
|
|
static int mouse_x, mouse_y, mouse_z;
|
|
static const float JLT = -1.0f / 3.0f;
|
|
static const float JHT = 1.0f / 3.0f;
|
|
|
|
bool input_create()
|
|
{
|
|
if (gx_input = gx_runtime->openInput(0)) {
|
|
if (gx_keyboard = gx_input->getKeyboard()) {
|
|
if (gx_mouse = gx_input->getMouse()) {
|
|
gx_joysticks.clear();
|
|
for (int k = 0; k < gx_input->numJoysticks(); ++k) {
|
|
gx_joysticks.push_back(gx_input->getJoystick(k));
|
|
}
|
|
mouse_x = mouse_y = mouse_z = 0;
|
|
return true;
|
|
}
|
|
}
|
|
gx_runtime->closeInput(gx_input);
|
|
gx_input = 0;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool input_destroy()
|
|
{
|
|
gx_joysticks.clear();
|
|
gx_runtime->closeInput(gx_input);
|
|
gx_input = 0;
|
|
return true;
|
|
}
|
|
|
|
int bbKeyDown(int n)
|
|
{
|
|
return gx_keyboard->keyDown(n);
|
|
}
|
|
|
|
int bbKeyHit(int n)
|
|
{
|
|
return gx_keyboard->keyHit(n);
|
|
}
|
|
|
|
int bbGetKey()
|
|
{
|
|
return gx_input->toAscii(gx_keyboard->getKey());
|
|
}
|
|
|
|
int bbWaitKey()
|
|
{
|
|
for (;;) {
|
|
if (!gx_runtime->idle())
|
|
ThrowRuntimeException(0);
|
|
if (int key = gx_keyboard->getKey()) {
|
|
if (key = gx_input->toAscii(key))
|
|
return key;
|
|
}
|
|
gx_runtime->delay(20);
|
|
}
|
|
}
|
|
|
|
void bbFlushKeys()
|
|
{
|
|
gx_keyboard->flush();
|
|
}
|
|
|
|
int bbMouseDown(int n)
|
|
{
|
|
return gx_mouse->keyDown(n);
|
|
}
|
|
|
|
int bbMouseHit(int n)
|
|
{
|
|
return gx_mouse->keyHit(n);
|
|
}
|
|
|
|
int bbGetMouse()
|
|
{
|
|
return gx_mouse->getKey();
|
|
}
|
|
|
|
int bbWaitMouse()
|
|
{
|
|
for (;;) {
|
|
if (!gx_runtime->idle())
|
|
ThrowRuntimeException(0);
|
|
if (int key = gx_mouse->getKey())
|
|
return key;
|
|
gx_runtime->delay(20);
|
|
}
|
|
}
|
|
|
|
int bbMouseWait()
|
|
{
|
|
return bbWaitMouse();
|
|
}
|
|
|
|
int bbMouseX()
|
|
{
|
|
return gx_mouse->getAxisState(0);
|
|
}
|
|
|
|
int bbMouseY()
|
|
{
|
|
return gx_mouse->getAxisState(1);
|
|
}
|
|
|
|
int bbMouseZ()
|
|
{
|
|
return gx_mouse->getAxisState(2) / 120;
|
|
}
|
|
|
|
int bbMouseXSpeed()
|
|
{
|
|
int dx = bbMouseX() - mouse_x;
|
|
mouse_x += dx;
|
|
return dx;
|
|
}
|
|
|
|
int bbMouseYSpeed()
|
|
{
|
|
int dy = bbMouseY() - mouse_y;
|
|
mouse_y += dy;
|
|
return dy;
|
|
}
|
|
|
|
int bbMouseZSpeed()
|
|
{
|
|
int dz = bbMouseZ() - mouse_z;
|
|
mouse_z += dz;
|
|
return dz;
|
|
}
|
|
|
|
void bbFlushMouse()
|
|
{
|
|
gx_mouse->flush();
|
|
}
|
|
|
|
void bbMoveMouse(int x, int y)
|
|
{
|
|
gx_input->moveMouse(mouse_x = x, mouse_y = y);
|
|
}
|
|
|
|
int bbJoyType(int port)
|
|
{
|
|
return gx_input->getJoystickType(port);
|
|
}
|
|
|
|
int bbJoyDown(int n, int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
return gx_joysticks[port]->keyDown(n);
|
|
}
|
|
|
|
int bbJoyHit(int n, int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
return gx_joysticks[port]->keyHit(n);
|
|
}
|
|
|
|
int bbGetJoy(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
return gx_joysticks[port]->getKey();
|
|
}
|
|
|
|
int bbWaitJoy(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
for (;;) {
|
|
if (!gx_runtime->idle())
|
|
ThrowRuntimeException(0);
|
|
if (int key = gx_joysticks[port]->getKey())
|
|
return key;
|
|
gx_runtime->delay(20);
|
|
}
|
|
}
|
|
|
|
float bbJoyX(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
return gx_joysticks[port]->getAxisState(0);
|
|
}
|
|
|
|
float bbJoyY(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
return gx_joysticks[port]->getAxisState(1);
|
|
}
|
|
|
|
float bbJoyZ(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
return gx_joysticks[port]->getAxisState(2);
|
|
}
|
|
|
|
float bbJoyU(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
return gx_joysticks[port]->getAxisState(3);
|
|
}
|
|
|
|
float bbJoyV(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
return gx_joysticks[port]->getAxisState(4);
|
|
}
|
|
|
|
float bbJoyPitch(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
return gx_joysticks[port]->getAxisState(5) * 180;
|
|
}
|
|
|
|
float bbJoyYaw(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
return gx_joysticks[port]->getAxisState(6) * 180;
|
|
}
|
|
|
|
float bbJoyRoll(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
return gx_joysticks[port]->getAxisState(7) * 180;
|
|
}
|
|
|
|
int bbJoyHat(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
return gx_joysticks[port]->getAxisState(8);
|
|
}
|
|
|
|
int bbJoyXDir(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
float t = gx_joysticks[port]->getAxisState(0);
|
|
return t < JLT ? -1 : (t > JHT ? 1 : 0);
|
|
}
|
|
|
|
int bbJoyYDir(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
float t = gx_joysticks[port]->getAxisState(1);
|
|
return t < JLT ? -1 : (t > JHT ? 1 : 0);
|
|
}
|
|
|
|
int bbJoyZDir(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
float t = gx_joysticks[port]->getAxisState(2);
|
|
return t < JLT ? -1 : (t > JHT ? 1 : 0);
|
|
}
|
|
|
|
int bbJoyUDir(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
float t = gx_joysticks[port]->getAxisState(3);
|
|
return t < JLT ? -1 : (t > JHT ? 1 : 0);
|
|
}
|
|
|
|
int bbJoyVDir(int port)
|
|
{
|
|
if (port < 0 || port >= gx_joysticks.size())
|
|
return 0;
|
|
float t = gx_joysticks[port]->getAxisState(4);
|
|
return t < JLT ? -1 : (t > JHT ? 1 : 0);
|
|
}
|
|
|
|
void bbFlushJoy()
|
|
{
|
|
for (int k = 0; k < gx_joysticks.size(); ++k)
|
|
gx_joysticks[k]->flush();
|
|
}
|
|
|
|
void bbEnableDirectInput(int enable)
|
|
{
|
|
gx_runtime->enableDirectInput(!!enable);
|
|
}
|
|
|
|
int bbDirectInputEnabled()
|
|
{
|
|
return gx_runtime->directInputEnabled();
|
|
}
|
|
|
|
void input_link(void (*rtSym)(const char* sym, void* pc))
|
|
{
|
|
rtSym("%KeyDown%key", bbKeyDown);
|
|
rtSym("%KeyHit%key", bbKeyHit);
|
|
rtSym("%GetKey", bbGetKey);
|
|
rtSym("%WaitKey", bbWaitKey);
|
|
rtSym("FlushKeys", bbFlushKeys);
|
|
|
|
rtSym("%MouseDown%button", bbMouseDown);
|
|
rtSym("%MouseHit%button", bbMouseHit);
|
|
rtSym("%GetMouse", bbGetMouse);
|
|
rtSym("%WaitMouse", bbWaitMouse);
|
|
rtSym("%MouseWait", bbWaitMouse);
|
|
rtSym("%MouseX", bbMouseX);
|
|
rtSym("%MouseY", bbMouseY);
|
|
rtSym("%MouseZ", bbMouseZ);
|
|
rtSym("%MouseXSpeed", bbMouseXSpeed);
|
|
rtSym("%MouseYSpeed", bbMouseYSpeed);
|
|
rtSym("%MouseZSpeed", bbMouseZSpeed);
|
|
rtSym("FlushMouse", bbFlushMouse);
|
|
rtSym("MoveMouse%x%y", bbMoveMouse);
|
|
|
|
rtSym("%JoyType%port=0", bbJoyType);
|
|
rtSym("%JoyDown%button%port=0", bbJoyDown);
|
|
rtSym("%JoyHit%button%port=0", bbJoyHit);
|
|
rtSym("%GetJoy%port=0", bbGetJoy);
|
|
rtSym("%WaitJoy%port=0", bbWaitJoy);
|
|
rtSym("%JoyWait%port=0", bbWaitJoy);
|
|
rtSym("#JoyX%port=0", bbJoyX);
|
|
rtSym("#JoyY%port=0", bbJoyY);
|
|
rtSym("#JoyZ%port=0", bbJoyZ);
|
|
rtSym("#JoyU%port=0", bbJoyU);
|
|
rtSym("#JoyV%port=0", bbJoyV);
|
|
rtSym("#JoyPitch%port=0", bbJoyPitch);
|
|
rtSym("#JoyYaw%port=0", bbJoyYaw);
|
|
rtSym("#JoyRoll%port=0", bbJoyRoll);
|
|
rtSym("%JoyHat%port=0", bbJoyHat);
|
|
rtSym("%JoyXDir%port=0", bbJoyXDir);
|
|
rtSym("%JoyYDir%port=0", bbJoyYDir);
|
|
rtSym("%JoyZDir%port=0", bbJoyZDir);
|
|
rtSym("%JoyUDir%port=0", bbJoyUDir);
|
|
rtSym("%JoyVDir%port=0", bbJoyVDir);
|
|
rtSym("FlushJoy", bbFlushJoy);
|
|
|
|
rtSym("EnableDirectInput%enable", bbEnableDirectInput);
|
|
rtSym("%DirectInputEnabled", bbDirectInputEnabled);
|
|
}
|