-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAccSnow.cpp
More file actions
98 lines (80 loc) · 2.67 KB
/
AccSnow.cpp
File metadata and controls
98 lines (80 loc) · 2.67 KB
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
#include "stdafx.h"
#include "Base.h"
#include "AccSnow.h"
bool classAccSnow::isFirstInit = true;
classAccSnow::classAccSnow(vpObserver *_observer, vsChannel::Subscriber *_subscriber):classBase(_observer,_subscriber,ENABLE_KEY),density(0)
{
init();
}
classAccSnow::classAccSnow(const char *_name, vsChannel::Subscriber *_subscriber):classBase(_name,_subscriber,ENABLE_KEY),density(0)
{
init();
}
classAccSnow::~classAccSnow()
{
pChannel->setRepresentationIndex(0);
pChannel->removeRepresentation(representation);
pShaderDeployer->removeRepresentation("r_accsnow");
isFirstInit = true;
}
void classAccSnow::init(void)
{
if( (pVertexShader = pShaderDeployer->getShader("v_accsnow")) == NULL )
std::cout << " vShader \"v_accsnow\" doesn't exist! " << std::endl;
if( (pFragmentShader = pShaderDeployer->getShader("f_accsnow")) == NULL )
std::cout << " fShader \"f_accsnow\" doesn't exist! " << std::endl;
acc_density = vuParameter::obtain< vuParameterTyped<float> >("density");
pShaderDeployer->addRepresentation("r_accsnow");
representation = pShaderDeployer->getRepresentation("r_accsnow");
if(isFirstInit == true)
{
vsTraversalUser<int, vsTraversalLookUpNodeId> trav;
trav.addPreVisit(vsGeometry::getStaticNodeId(), this, travFunc);
trav.visit(pObject);
isFirstInit = false;
}
}
void classAccSnow::handleKey(vrWindow::Key _key, int _mod)
{
switch (_key)
{
case vrWindow::KEY_F5:
pChannel->setRepresentationIndex( pChannel->getRepresentationIndex() == representation ? 0 : representation );
break;
case vrWindow::KEY_UP:
acc_density->set(density >= 10000.0f ? density = 10000.0f : density += 0.1);
break;
case vrWindow::KEY_DOWN:
acc_density->set(density < 0.1f ? density = 0.1f : density -= 0.1);
break;
}
}
void classAccSnow::setDensity(float _density)
{
if(_density != 0)
pChannel->setRepresentationIndex(representation);
else
pChannel->setRepresentationIndex(0);
acc_density->set(_density);
}
vsTraversal::Result classAccSnow::travFunc(vsNode *node, int)
{
vsGeometry *geometry = static_cast<vsGeometry *>(node);
geometry->setGeometry(geometry->getGeometry(), representation);
vrState *state = new vrState();
vsgu::copy(state, geometry->getState());
if(pVertexShader != NULL)
{
vrShader::ElementVertex vertexShaderElement;
vertexShaderElement.m_shader = pVertexShader;
state->setElement(vrShader::ElementVertex::Id, &vertexShaderElement);
}
if(pFragmentShader != NULL)
{
vrShader::ElementFragment fragmentShaderElement;
fragmentShaderElement.m_shader = pFragmentShader;
state->setElement(vrShader::ElementFragment::Id, &fragmentShaderElement);
}
geometry->setState(state, representation);
return vsTraversal::RESULT_CONTINUE;
}