aboutsummaryrefslogtreecommitdiff
path: root/extensions/smgrid.cpp
blob: 5e00a6b7f47ff59f63b263e232b59afbf3a7ced8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// -*- C++ -*-
/*
 * Simple MultimEdia LiTerator(SMELT)
 * by Chris Xiong 2015
 * Distortion grid implementation
 *
 * WARNING: This library is in development and interfaces would be very
 * unstable.
 *
 */
#include "smgrid.hpp"
#include <cstring>
SMELT *smGrid::sm=0;
smGrid::smGrid(int _cc,int _rc)
{
	sm=smGetInterface(SMELT_APILEVEL);
	cc=_cc;rc=_rc;cw=ch=.0;
	quad.tex=0;quad.blend=BLEND_ALPHABLEND;
	pos=new smVertex[cc*rc];
	for(int i=0;i<cc*rc;++i)
	{
		pos[i].x=pos[i].y=pos[i].z=.0;
		pos[i].tx=pos[i].ty=.0;
		pos[i].col=0xFFFFFFFF;
	}
}
smGrid::smGrid(const smGrid &copy)
{
	sm=smGetInterface(SMELT_APILEVEL);
	cc=copy.cc;rc=copy.rc;cw=copy.cw;ch=copy.ch;
	quad=copy.quad;tx=copy.tx;ty=copy.ty;w=copy.w;h=copy.h;
	pos=new smVertex[cc*rc];memcpy(pos,copy.pos,sizeof(smVertex)*cc*rc);
}
smGrid::~smGrid(){delete[] pos;sm->smRelease();}
smGrid& smGrid::operator =(const smGrid &copy)
{
	if(this!=&copy)
	{
		sm=smGetInterface(SMELT_APILEVEL);
		cc=copy.cc;rc=copy.rc;cw=copy.cw;ch=copy.ch;
		quad=copy.quad;tx=copy.tx;ty=copy.ty;w=copy.w;h=copy.h;
		delete[] pos;pos=new smVertex[cc*rc];
		memcpy(pos,copy.pos,sizeof(smVertex)*cc*rc);
	}
	return *this;
}
void smGrid::setTexture(SMTEX tex){quad.tex=tex;}
void smGrid::setTextureRect4f(float _x,float _y,float _w,float _h)
{
	float tw,th;
	tx=_x;ty=_y;w=_w;h=_h;
	if(quad.tex)
	{
		tw=(float)sm->smTextureGetWidth(quad.tex);
		th=(float)sm->smTextureGetHeight(quad.tex);
	}
	else tw=w,th=h;
	cw=w/(cc-1);ch=h/(rc-1);
	for(int i=0;i<rc;++i)
	for(int j=0;j<cc;++j)
	{
		pos[i*cc+j].tx=(tx+j*cw)/tw;
		pos[i*cc+j].ty=(ty+i*ch)/th;
		pos[i*cc+j].x=j*cw;
		pos[i*cc+j].y=i*ch;
	}
}
void smGrid::setTextureRectv(smTexRect rect){setTextureRect4f(rect.x,rect.y,rect.w,rect.h);}
void smGrid::setBlend(int blend){quad.blend=blend;}
void smGrid::setColor(int c,int r,DWORD col){if(c<cc&&r<rc)pos[r*cc+c].col=col;}
void smGrid::setPos(int c,int r,float x,float y,float z,int ref)
{
	if(c>=0&&r>=0&&c<cc&&r<rc)
	{
		if(ref==GRID_REFCENTER)x+=cw*(cc-1)/2,y+=ch*(rc-1)/2;
		if(ref==GRID_REFNODE)x+=c*cw,y+=r*ch;
		if(ref==GRID_REFCURRENT)x+=pos[r*cc+c].x,y+=pos[r*cc+c].y;
		pos[r*cc+c].x=x;
		pos[r*cc+c].y=y;
	}
}
void smGrid::clear(DWORD col)
{
	for(int i=0;i<rc;++i)
	for(int j=0;j<cc;++j)
	{
		pos[i*cc+j].x=j*cw;
		pos[i*cc+j].y=i*ch;
		pos[i*cc+j].z=.0;
		pos[i*cc+j].col=col;
	}
}
void smGrid::render(float x,float y)
{
	for(int i=0;i<rc-1;++i)
	for(int j=0;j<cc-1;++j)
	{
		int id=i*cc+j;
		for(int k=0;k<4;++k)
		{
			int sub=k<2?id+k:id+cc+3-k;
			quad.v[k].tx=pos[sub].tx;
			quad.v[k].ty=pos[sub].ty;
			quad.v[k].x=x+pos[sub].x;
			quad.v[k].y=y+pos[sub].y;
			quad.v[k].z=pos[sub].z;
			quad.v[k].col=pos[sub].col;
		}
		sm->smRenderQuad(&quad);
	}
}