File: TexAnimation.cpp

package info (click to toggle)
pinball 0.3.20201218-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 8,452 kB
  • sloc: cpp: 15,230; makefile: 840; sh: 381; xml: 24
file content (76 lines) | stat: -rw-r--r-- 1,988 bytes parent folder | download | duplicates (9)
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
/***************************************************************************
                          TexAnimation.cpp  -  description
                             -------------------
    begin                : Wed Jan 26 2000
    copyright            : (C) 2000 by Henrik Enqvist
    email                : henqvist@excite.com
 ***************************************************************************/

#include "Private.h"
#include "TexAnimation.h"
#include "Group.h"
#include "math.h"
#include "Light.h"
#include "BillBoard.h"

TexAnimation::TexAnimation(int step, int nvtx) : Behavior() {
	EmAssert(nvtx > 0, "TexAnimation::TexAnimation nvtx less than 1");
	m_iStep = step;
	m_iTick = 0;
	m_iTexCoord = nvtx;
}

TexAnimation::~TexAnimation() {
}

void TexAnimation::add(float u, float v) {
	TexCoord tex;
	tex.u = u;
	tex.v = v;
	m_vTexCoord.push_back(tex);
}

void TexAnimation::onTick() {
	EmAssert(this->getParent() != NULL, "Parent not allowed to be null");
	
	float sU, sV, eU, eV, u, v;
  int size = (int)(m_vTexCoord.size()/m_iTexCoord);
	
	if (m_iTick >= size*m_iStep) {
		m_iTick = 0;
	}
	
	int index = (int)(m_iTick/m_iStep);

	// TODO this mtherfcker will crash !!!
	for (int a=0; a<m_iTexCoord && a<4; a++) {
		sU = m_vTexCoord[index*m_iTexCoord + a].u;
		sV = m_vTexCoord[index*m_iTexCoord + a].v;
	
		if (index + 1 < size) {
			eU = m_vTexCoord[(index+1)*m_iTexCoord + a].u;
			eV = m_vTexCoord[(index+1)*m_iTexCoord + a].v;
		} else {
			eU = m_vTexCoord[a].u;
			eV = m_vTexCoord[a].v;
		}	

		/*
		k = ((float)(m_iTick%(m_iStep*m_iTexCoord))/m_iStep);
		u = (float)(sU + (eU - sU)*k);
		v = (float)(sV + (eV - sV)*k);
		*/
		u = sU;
		v = sV;
		
		BillBoard * b = this->getParent()->getBillBoard();
		if (b != NULL) {
			b->setUV(u, v, a);
			EM_COUT("TexAnimation::onTick() " << u <<" "<< v <<" size "<< size <<" index "<< 
							index <<" tick "<< m_iTick, 0);
		}
	}

	m_iTick++;
}