From 92f17580846c88108aab023092c23e6bcdcf2f75 Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Fri, 14 Aug 2015 23:45:02 +0800 Subject: SMELT is finally finished! Add the SMELT library for future use. Add .gitignore. --- extensions/smentity.cpp | 191 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 extensions/smentity.cpp (limited to 'extensions/smentity.cpp') diff --git a/extensions/smentity.cpp b/extensions/smentity.cpp new file mode 100644 index 0000000..43c81ac --- /dev/null +++ b/extensions/smentity.cpp @@ -0,0 +1,191 @@ +// -*- C++ -*- +/* + * Simple MultimEdia LiTerator(SMELT) + * by Chris Xiong 2015 + * api level 1 + * Entity implementation + * + * WARNING: This library is in development and interfaces would be very + * unstable. + * + */ +#include "smentity.hpp" +#include "smmath.hpp" +#include +#include +SMELT *smEntity2D::sm=NULL; +SMELT *smEntity3D::sm=NULL; + +smEntity2D::smEntity2D(SMTEX tex,float _x,float _y,float _w,float _h) +{ + sm=smGetInterface(SMELT_APILEVEL); + tx=_x;ty=_y;w=_w;h=_h; + if(tex) + { + texw=sm->smTextureGetWidth(tex); + texh=sm->smTextureGetHeight(tex); + }else texw=texh=1.; + ctrx=ctry=0;quad.tex=tex; + quad.v[0].tx=_x/texw;quad.v[0].ty=_y/texh; + quad.v[1].tx=(_x+_w)/texw;quad.v[1].ty=_y/texh; + quad.v[2].tx=(_x+_w)/texw;quad.v[2].ty=(_y+_h)/texh; + quad.v[3].tx=_x/texw;quad.v[3].ty=(_y+_h)/texh; + for(int i=0;i<4;++i){quad.v[i].z=.5f;quad.v[i].col=0xFFFFFFFF;} + quad.blend=BLEND_ALPHABLEND; +} +smEntity2D::smEntity2D(SMTEX tex,smTexRect rect) +{ + sm=smGetInterface(SMELT_APILEVEL); + tx=rect.x;ty=rect.y;w=rect.w;h=rect.h; + if(tex) + { + texw=sm->smTextureGetWidth(tex); + texh=sm->smTextureGetHeight(tex); + }else texw=texh=1.; + ctrx=ctry=0;quad.tex=tex; + quad.v[0].tx=rect.x/texw;quad.v[0].ty=rect.y/texh; + quad.v[1].tx=(rect.x+rect.w)/texw;quad.v[1].ty=rect.y/texh; + quad.v[2].tx=(rect.x+rect.w)/texw;quad.v[2].ty=(rect.y+rect.h)/texh; + quad.v[3].tx=rect.x/texw;quad.v[3].ty=(rect.y+rect.h)/texh; + for(int i=0;i<4;++i){quad.v[i].z=.5f;quad.v[i].col=0xFFFFFFFF;} + quad.blend=BLEND_ALPHABLEND; +} +smEntity2D::smEntity2D(const smEntity2D ©) +{ + memcpy(this,©,sizeof(smEntity2D)); + sm=smGetInterface(SMELT_APILEVEL); +} +void smEntity2D::render(float x,float y,float rot,float wsc,float hsc) +{ + if(hscsmRenderQuad(&quad); +} +void smEntity2D::setTexture(SMTEX tex) +{ + float ntw,nth; + if(tex) + { + ntw=sm->smTextureGetWidth(tex); + nth=sm->smTextureGetHeight(tex); + }else ntw=nth=1.; + quad.tex=tex; + if(ntw!=texw||nth!=texh) + { + float tx1=quad.v[0].tx*texw,ty1=quad.v[0].ty*texh; + float tx2=quad.v[2].tx*texw,ty2=quad.v[2].ty*texh; + texw=ntw;texh=nth; + tx1/=texw;ty1/=texh;tx2/=texw;ty2/=texh; + quad.v[0].tx=tx1;quad.v[0].ty=ty1; + quad.v[1].tx=tx2;quad.v[1].ty=ty1; + quad.v[2].tx=tx2;quad.v[2].ty=ty2; + quad.v[3].tx=tx1;quad.v[3].ty=ty2; + } +} +void smEntity2D::setTextureRect4f(float _x,float _y,float _w,float _h) +{ + tx=_x;ty=_y;w=_w;h=_h; + quad.v[0].tx=_x/texw;quad.v[0].ty=_y/texh; + quad.v[1].tx=(_x+_w)/texw;quad.v[1].ty=_y/texh; + quad.v[2].tx=(_x+_w)/texw;quad.v[2].ty=(_y+_h)/texh; + quad.v[3].tx=_x/texw;quad.v[3].ty=(_y+_h)/texh; +} +void smEntity2D::setTextureRectv(smTexRect rect){setTextureRect4f(rect.x,rect.y,rect.w,rect.h);} +void smEntity2D::setColor(DWORD col,int v) +{ + if(v>=0&&v<4)quad.v[v].col=col; + else for(int i=0;i<4;++i)quad.v[i].col=col; +} +void smEntity2D::setZ(float z,int v) +{ + if(v>=0&&v<4)quad.v[v].z=z; + else for(int i=0;i<4;++i)quad.v[i].z=z; +} +void smEntity2D::setBlend(int blend){quad.blend=blend;} +void smEntity2D::setCentre(float x,float y){ctrx=x;ctry=y;} + +smEntity3D::smEntity3D(SMTEX tex,float _x,float _y,float _w,float _h) +{ + sm=smGetInterface(SMELT_APILEVEL); + tx=_x;ty=_y;w=_w;h=_h; + if(tex) + { + texw=sm->smTextureGetWidth(tex); + texh=sm->smTextureGetHeight(tex); + }else texw=texh=1.; + ctrx=ctry=0;quad.tex=tex; + quad.v[0].tx=_x/texw;quad.v[0].ty=_y/texh; + quad.v[1].tx=(_x+_w)/texw;quad.v[1].ty=_y/texh; + quad.v[2].tx=(_x+_w)/texw;quad.v[2].ty=(_y+_h)/texh; + quad.v[3].tx=_x/texw;quad.v[3].ty=(_y+_h)/texh; + for(int i=0;i<4;++i){quad.v[i].z=.5f;quad.v[i].col=0xFFFFFFFF;} + quad.blend=BLEND_ALPHABLEND; +} +smEntity3D::smEntity3D(const smEntity3D ©) +{ + memcpy(this,©,sizeof(smEntity3D)); + sm=smGetInterface(SMELT_APILEVEL); +} +void smEntity3D::render9f(float x,float y,float z,float ra,float rx,float ry,float rz,float wsc,float hsc) +{ + if(hscsmRenderQuad(&quad); +} +void smEntity3D::renderfv(float* pos,float* rot,float* scale) +{ + render9f(pos[0],pos[1],pos[2],rot[0],rot[1],rot[2],rot[3],scale[0],scale[1]); +} +void smEntity3D::setTexture(SMTEX tex) +{ + float ntw,nth; + if(tex) + { + ntw=sm->smTextureGetWidth(tex); + nth=sm->smTextureGetHeight(tex); + }else ntw=nth=1.; + quad.tex=tex; + if(ntw!=texw||nth!=texh) + { + float tx1=quad.v[0].tx*texw,ty1=quad.v[0].ty*texh; + float tx2=quad.v[2].tx*texw,ty2=quad.v[2].ty*texh; + texw=ntw;texh=nth; + tx1/=texw;ty1/=texh;tx2/=texw;ty2/=texh; + quad.v[0].tx=tx1;quad.v[0].ty=ty1; + quad.v[1].tx=tx2;quad.v[1].ty=ty1; + quad.v[2].tx=tx2;quad.v[2].ty=ty2; + quad.v[3].tx=tx1;quad.v[3].ty=ty2; + } +} +void smEntity3D::setTextureRect4f(float _x,float _y,float _w,float _h) +{ + tx=_x;ty=_y;w=_w;h=_h; + quad.v[0].tx=_x/texw;quad.v[0].ty=_y/texh; + quad.v[1].tx=(_x+_w)/texw;quad.v[1].ty=_y/texh; + quad.v[2].tx=(_x+_w)/texw;quad.v[2].ty=(_y+_h)/texh; + quad.v[3].tx=_x/texw;quad.v[3].ty=(_y+_h)/texh; +} +void smEntity3D::setTextureRectv(smTexRect rect){setTextureRect4f(rect.x,rect.y,rect.w,rect.h);} +void smEntity3D::setColor(DWORD col,int v) +{ + if(v>=0&&v<4)quad.v[v].col=col; + else for(int i=0;i<4;++i)quad.v[i].col=col; +} +void smEntity3D::setBlend(int blend){quad.blend=blend;} +void smEntity3D::setCentre(float x,float y){ctrx=x;ctry=y;} -- cgit v1.2.3