// -*- C++ -*-
/*
* Simple MultimEdia LiTerator(SMELT)
* by Chris Xiong 2015
* api level 3
* Public header
*
* WARNING: This library is in development and interfaces would be very
* unstable.
* This library is developed for the BLR series games.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*/
#ifndef SMELT_H
#define SMELT_H
#include <stddef.h>
#include <stdint.h>
#define SMELT_APILEVEL 3
typedef uint32_t DWORD;
typedef uint16_t WORD;
typedef uint8_t BYTE;
#define PI 3.14159265358979323846f
//Handles
typedef size_t SMTEX;//Texture Handle
typedef size_t SMTRG;//Target Handle
typedef size_t SMSFX;//SoundFX Handle
typedef size_t SMCHN;//Channel Handle
//Color Marcos
#define RGBA(r,g,b,a) ((DWORD(a)<<24)+(DWORD(r)<<16)+(DWORD(g)<<8)+DWORD(b))
#define ARGB(a,r,g,b) ((DWORD(a)<<24)+(DWORD(r)<<16)+(DWORD(g)<<8)+DWORD(b))
#define GETA(col) ((col)>>24)
#define GETR(col) (((col)>>16)&0xFF)
#define GETG(col) (((col)>>8)&0xFF)
#define GETB(col) ((col)&0xFF)
#define SETA(col,a) (((col)&0x00FFFFFF)+(DWORD(a)<<24))
#define SETR(col,r) (((col)&0xFF00FFFF)+(DWORD(r)<<16))
#define SETG(col,g) (((col)&0xFFFF00FF)+(DWORD(g)<<8))
#define SETB(col,b) (((col)&0xFFFFFF00)+DWORD(b))
//Blend Modes
#define BLEND_COLORADD 0x1
#define BLEND_COLORMUL 0x0
#define BLEND_COLORINV 0x8
#define BLEND_ALPHABLEND 0x2
#define BLEND_ALPHAADD 0x0
#define BLEND_ZWRITE 0x4
#define BLEND_NOZWRITE 0x0
typedef bool (*smHook)();
#define FPS_FREE 0
#define FPS_VSYNC -1
#define PRIM_LINES 2
#define PRIM_TRIANGLES 3
#define PRIM_QUADS 4
struct smTexRect
{
smTexRect(){x=y=w=h=.0;}
smTexRect(float _x,float _y,float _w,float _h){x=_x;y=_y;w=_w;h=_h;}
float x,y,w,h;
};
struct smVertex
{
float x,y,z;//Position. Z can be used for depth testing in 2D Mode.
DWORD col;//Color.
float tx,ty;//Texture coords.
};
struct smTriangle
{
smVertex v[3];
SMTEX tex;
int blend;
};
struct smQuad
{
smVertex v[4];
SMTEX tex;
int blend;
};
struct smInpEvent
{
int type,flag;
int sccode,chcode;
int wheel,x,y;
//TODO: add joystick
};
class SMELT
{
public:
SMELT(){}
virtual ~SMELT(){}
virtual void smRelease()=0;
virtual bool smInit()=0;
virtual void smFinale()=0;
virtual void smMainLoop()=0;
virtual void smUpdateFunc(smHook func)=0;
virtual void smUnFocFunc(smHook func)=0;
virtual void smFocFunc(smHook func)=0;
virtual void smQuitFunc(smHook func)=0;
virtual void smWinTitle(const char* title)=0;
virtual bool smIsActive()=0;
virtual void smNoSuspend(bool para)=0;
virtual void smVidMode(int resX,int resY,bool _windowed)=0;
virtual void smLogFile(const char* path)=0;
virtual void smLog(const char* format,...)=0;
virtual void smScreenShot(const char* path)=0;
virtual void smSetFPS(int fps)=0;
virtual float smGetFPS()=0;
virtual float smGetDelta()=0;
virtual float smGetTime()=0;
virtual SMSFX smSFXLoad(const char *path)=0;
virtual SMSFX smSFXLoadFromMemory(const char *ptr,DWORD size)=0;
virtual SMCHN smSFXPlay(SMSFX fx,int vol=100,int pan=0,float pitch=1.,bool loop=0)=0;
virtual float smSFXGetLengthf(SMSFX fx)=0;
virtual DWORD smSFXGetLengthd(SMSFX fx)=0;
virtual void smSFXSetLoopPoint(SMSFX fx,DWORD l,DWORD r)=0;
virtual void smSFXFree(SMSFX fx)=0;
virtual void smChannelVol(SMCHN chn,int vol)=0;
virtual void smChannelPan(SMCHN chn,int pan)=0;
virtual void smChannelPitch(SMCHN chn,float pitch)=0;
virtual void smChannelPause(SMCHN chn)=0;
virtual void smChannelResume(SMCHN chn)=0;
virtual void smChannelStop(SMCHN chn)=0;
virtual void smChannelPauseAll()=0;
virtual void smChannelResumeAll()=0;
virtual void smChannelStopAll()=0;
virtual bool smChannelIsPlaying(SMCHN chn)=0;
virtual float smChannelGetPosf(SMCHN chn)=0;
virtual void smChannelSetPosf(SMCHN chn,float pos)=0;
virtual int smChannelGetPosd(SMCHN chn)=0;
virtual void smChannelSetPosd(SMCHN chn,int pos)=0;
virtual void smGetMouse2f(float *x,float *y)=0;
virtual void smSetMouse2f(float x,float y)=0;
virtual int smGetWheel()=0;
virtual bool smIsMouseOver()=0;
virtual int smGetKeyState(int key)=0;
virtual int smGetKey()=0;
virtual bool smGetInpEvent(smInpEvent *e)=0;
virtual bool smRenderBegin2D(bool ztest=0,SMTRG trg=0)=0;
virtual bool smRenderBegin3D(float fov,SMTRG trg=0)=0;
virtual bool smRenderEnd()=0;
virtual void sm3DCamera6f2v(float *pos,float *rot)=0;
virtual void sm2DCamera5f3v(float *pos,float *dpos,float *rot)=0;
virtual void smMultViewMatrix(float *mat)=0;
virtual void smClrscr(DWORD color)=0;
virtual void smRenderLinefd(float x1,float y1,float z1,float x2,float y2,float z2,DWORD color)=0;
virtual void smRenderLinefvd(float *p1,float *p2,DWORD color)=0;
virtual void smRenderTriangle(smTriangle *t)=0;
virtual void smRenderQuad(smQuad *q)=0;
virtual smVertex* smGetVertArray()=0;
virtual void smDrawVertArray(int prim,SMTEX texture,int blend,int _primcnt)=0;
virtual SMTRG smTargetCreate(int w,int h)=0;
virtual SMTEX smTargetTexture(SMTRG targ)=0;
virtual void smTargetFree(SMTRG targ)=0;
virtual SMTEX smTextureCreate(int w,int h)=0;
virtual SMTEX smTextureLoad(const char *path)=0;
virtual SMTEX smTextureLoadFromMemory(const char *ptr,DWORD size)=0;
virtual void smTextureFree(SMTEX tex)=0;
virtual int smTextureGetWidth(SMTEX tex,bool original=false)=0;
virtual int smTextureGetHeight(SMTEX tex,bool original=false)=0;
virtual DWORD* smTextureLock(SMTEX tex,int l,int t,int w,int h,bool ro=true)=0;
virtual void smTexutreUnlock(SMTEX tex)=0;
};
SMELT* smGetInterface(int apilevel);
//event types
#define INPUT_KEYDOWN 1
#define INPUT_KEYUP 2
#define INPUT_MBUTTONDOWN 3
#define INPUT_MBUTTONUP 4
#define INPUT_MOUSEMOVE 5
#define INPUT_MOUSEWHEEL 6
//key mods/flags
#define SMINP_SHIFT 0x1
#define SMINP_CTRL 0x2
#define SMINP_ALT 0x4
#define SMINP_CAPSLOCK 0x8
#define SMINP_SCROLLLOCK 0x10
#define SMINP_NUMLOCK 0x20
#define SMINP_REPEAT 0x40
//key codes
#define SMK_LBUTTON 0x01
#define SMK_RBUTTON 0x02
#define SMK_MBUTTON 0x04
#define SMK_ESCAPE 0x1B
#define SMK_BACKSPACE 0x08
#define SMK_TAB 0x09
#define SMK_ENTER 0x0D
#define SMK_SPACE 0x20
#define SMK_SHIFT 0x10
#define SMK_CTRL 0x11
#define SMK_ALT 0x12
#define SMK_LWIN 0x5B
#define SMK_RWIN 0x5C
#define SMK_APPS 0x5D
#define SMK_PAUSE 0x13
#define SMK_CAPSLOCK 0x14
#define SMK_NUMLOCK 0x90
#define SMK_SCROLLLOCK 0x91
#define SMK_PGUP 0x21
#define SMK_PGDN 0x22
#define SMK_HOME 0x24
#define SMK_END 0x23
#define SMK_INSERT 0x2D
#define SMK_DELETE 0x2E
#define SMK_LEFT 0x25
#define SMK_UP 0x26
#define SMK_RIGHT 0x27
#define SMK_DOWN 0x28
#define SMK_0 0x30
#define SMK_1 0x31
#define SMK_2 0x32
#define SMK_3 0x33
#define SMK_4 0x34
#define SMK_5 0x35
#define SMK_6 0x36
#define SMK_7 0x37
#define SMK_8 0x38
#define SMK_9 0x39
#define SMK_A 0x41
#define SMK_B 0x42
#define SMK_C 0x43
#define SMK_D 0x44
#define SMK_E 0x45
#define SMK_F 0x46
#define SMK_G 0x47
#define SMK_H 0x48
#define SMK_I 0x49
#define SMK_J 0x4A
#define SMK_K 0x4B
#define SMK_L 0x4C
#define SMK_M 0x4D
#define SMK_N 0x4E
#define SMK_O 0x4F
#define SMK_P 0x50
#define SMK_Q 0x51
#define SMK_R 0x52
#define SMK_S 0x53
#define SMK_T 0x54
#define SMK_U 0x55
#define SMK_V 0x56
#define SMK_W 0x57
#define SMK_X 0x58
#define SMK_Y 0x59
#define SMK_Z 0x5A
#define SMK_GRAVE 0xC0
#define SMK_MINUS 0xBD
#define SMK_EQUALS 0xBB
#define SMK_BACKSLASH 0xDC
#define SMK_LBRACKET 0xDB
#define SMK_RBRACKET 0xDD
#define SMK_SEMICOLON 0xBA
#define SMK_APOSTROPHE 0xDE
#define SMK_COMMA 0xBC
#define SMK_PERIOD 0xBE
#define SMK_SLASH 0xBF
#define SMK_NUMPAD0 0x60
#define SMK_NUMPAD1 0x61
#define SMK_NUMPAD2 0x62
#define SMK_NUMPAD3 0x63
#define SMK_NUMPAD4 0x64
#define SMK_NUMPAD5 0x65
#define SMK_NUMPAD6 0x66
#define SMK_NUMPAD7 0x67
#define SMK_NUMPAD8 0x68
#define SMK_NUMPAD9 0x69
#define SMK_MULTIPLY 0x6A
#define SMK_DIVIDE 0x6F
#define SMK_ADD 0x6B
#define SMK_SUBTRACT 0x6D
#define SMK_DECIMAL 0x6E
#define SMK_F1 0x70
#define SMK_F2 0x71
#define SMK_F3 0x72
#define SMK_F4 0x73
#define SMK_F5 0x74
#define SMK_F6 0x75
#define SMK_F7 0x76
#define SMK_F8 0x77
#define SMK_F9 0x78
#define SMK_F10 0x79
#define SMK_F11 0x7A
#define SMK_F12 0x7B
#define SMKST_NONE 0
#define SMKST_HIT 1
#define SMKST_KEEP 2
#define SMKST_RELEASE 3
#endif