Refactorizations:

- Use initializer lists (C++11)
- Fixed several cppcheck messages, mostly about uninitialized variables in constructors
- particles.cpp: Improved parameter values and simplified code

git-svn-id: https://svn.code.sf.net/p/extremetuxracer/code/trunk@635 0420edf4-82e4-42fc-9478-35b55e6d67a3
master
pkeus 2016-01-29 09:05:00 +00:00
parent f8b1ad54e4
commit 817281efc3
10 changed files with 56 additions and 85 deletions

View File

@ -62,12 +62,13 @@ void TCourse::SetTranslatedData(const std::string& line2) {
CCourse Course;
CCourse::CCourse() {
vnc_array = nullptr;
mirrored = false;
curr_course = nullptr;
currentCourseList = nullptr;
CCourse::CCourse()
: curr_course(nullptr)
, nx(0), ny(0)
, base_height_value(0)
, mirrored(false)
, currentCourseList(nullptr)
, vnc_array(nullptr) {
}
CCourse::~CCourse() {
@ -275,49 +276,25 @@ void CCourse::MakeStandardPolyhedrons() {
// polyhedron "none"
// poyhedron "tree"
PolyArr[1].vertices.resize(6);
PolyArr[1].vertices[0] = TVector3d(0, 0, 0);
PolyArr[1].vertices[1] = TVector3d(0, 0.15, 0.5);
PolyArr[1].vertices[2] = TVector3d(0.5, 0.15, 0);
PolyArr[1].vertices[3] = TVector3d(0, 0.15, -0.5);
PolyArr[1].vertices[4] = TVector3d(-0.5, 0.15, 0);
PolyArr[1].vertices[5] = TVector3d(0, 1, 0);
PolyArr[1].vertices = {
TVector3d(0, 0, 0),
TVector3d(0, 0.15, 0.5),
TVector3d(0.5, 0.15, 0),
TVector3d(0, 0.15, -0.5),
TVector3d(-0.5, 0.15, 0),
TVector3d(0, 1, 0)
};
PolyArr[1].polygons.resize(8);
for (std::size_t i = 0; i < 8; i++) {
PolyArr[1].polygons[i].vertices.resize(3);
}
PolyArr[1].polygons[0].vertices[0] = 0;
PolyArr[1].polygons[0].vertices[1] = 1;
PolyArr[1].polygons[0].vertices[2] = 4;
PolyArr[1].polygons[1].vertices[0] = 0;
PolyArr[1].polygons[1].vertices[1] = 2;
PolyArr[1].polygons[1].vertices[2] = 1;
PolyArr[1].polygons[2].vertices[0] = 0;
PolyArr[1].polygons[2].vertices[1] = 3;
PolyArr[1].polygons[2].vertices[2] = 2;
PolyArr[1].polygons[3].vertices[0] = 0;
PolyArr[1].polygons[3].vertices[1] = 4;
PolyArr[1].polygons[3].vertices[2] = 3;
PolyArr[1].polygons[4].vertices[0] = 1;
PolyArr[1].polygons[4].vertices[1] = 5;
PolyArr[1].polygons[4].vertices[2] = 4;
PolyArr[1].polygons[5].vertices[0] = 2;
PolyArr[1].polygons[5].vertices[1] = 5;
PolyArr[1].polygons[5].vertices[2] = 1;
PolyArr[1].polygons[6].vertices[0] = 3;
PolyArr[1].polygons[6].vertices[1] = 5;
PolyArr[1].polygons[6].vertices[2] = 2;
PolyArr[1].polygons[7].vertices[0] = 4;
PolyArr[1].polygons[7].vertices[1] = 5;
PolyArr[1].polygons[7].vertices[2] = 3;
PolyArr[1].polygons = {
{ { 0, 1, 4 } },
{ { 0, 2, 1 } },
{ { 0, 3, 2 } },
{ { 0, 4, 3 } },
{ { 1, 5, 4 } },
{ { 2, 5, 1 } },
{ { 3, 5, 2 } },
{ { 4, 5, 3 } },
};
}
void CCourse::FreeTerrainTextures() {

View File

@ -169,8 +169,8 @@ public:
std::vector<TItem> NocollArr;
std::vector<TPolyhedron> PolyArr;
std::vector<CourseFields> Fields;
GLubyte *vnc_array;
std::vector<CourseFields> Fields;
GLubyte *vnc_array;
CCourseList* getGroup(std::size_t index);

View File

@ -47,12 +47,9 @@ void TLight::Enable(GLenum num) const {
CEnvironment Env;
CEnvironment::CEnvironment() {
CEnvironment::CEnvironment()
: lightcond{"sunny", "cloudy", "evening", "night"} {
EnvID = -1;
lightcond[0] = "sunny";
lightcond[1] = "cloudy";
lightcond[2] = "evening";
lightcond[3] = "night";
for (std::size_t i = 0; i < 4; i++)
LightIndex[lightcond[i]] = i;
Skybox = nullptr;

View File

@ -37,7 +37,6 @@ struct TPlane {
};
struct TPolygon { std::vector<int> vertices; };
struct TSphere { double radius; int divisions; };
struct TRay { TVector3d pt; TVector3d vec; };
struct TPolyhedron {

View File

@ -108,14 +108,11 @@ void TGuiParticle::Update(float time_step, float push_timestep, const TVector2d&
float dist_from_push = (std::pow((x - push_position.x), 2) +
std::pow((y - push_position.y), 2));
if (push_timestep > 0) {
f.x = PUSH_FACTOR * push_vector.x / push_timestep;
f.y = PUSH_FACTOR * push_vector.y / push_timestep;
f = PUSH_FACTOR / push_timestep * push_vector;
f.x = clamp(-MAX_PUSH_FORCE, f.x, MAX_PUSH_FORCE);
f.y = clamp(-MAX_PUSH_FORCE, f.y, MAX_PUSH_FORCE);
f.x *= 1.0/(PUSH_DIST_DECAY*dist_from_push + 1) *
size/ PARTICLE_SIZE_RANGE;
f.y *= 1.0/(PUSH_DIST_DECAY*dist_from_push + 1) *
size / PARTICLE_SIZE_RANGE;
f *= 1.0/(PUSH_DIST_DECAY*dist_from_push + 1) *
size/PARTICLE_SIZE_RANGE;
}
vel.x += (f.x - vel.x * AIR_DRAG) * time_step;
@ -124,7 +121,7 @@ void TGuiParticle::Update(float time_step, float push_timestep, const TVector2d&
x += vel.x * time_step * (size / PARTICLE_SIZE_RANGE);
y += vel.y * time_step * (size / PARTICLE_SIZE_RANGE);
x = clamp(-0.05f, x, 1.f);
x = clamp(-0.05f, x, 1.05f);
sprite.setPosition(x*Winsys.resolution.width, y*Winsys.resolution.height);
}
@ -144,8 +141,7 @@ void update_ui_snow(float time_step) {
float push_timestep = 0;
if (push_position_initialized) {
push_vector.x = push_position.x - last_push_position.x;
push_vector.y = push_position.y - last_push_position.y;
push_vector = push_position - last_push_position;
push_timestep = time;
}
last_push_position = push_position;
@ -176,8 +172,7 @@ void update_ui_snow(float time_step) {
}
if (time_step < PUSH_DECAY_TIME_CONSTANT) {
push_vector.x *= 1.0 - time_step/PUSH_DECAY_TIME_CONSTANT;
push_vector.y *= 1.0 - time_step/PUSH_DECAY_TIME_CONSTANT;
push_vector *= 1.0 - time_step/PUSH_DECAY_TIME_CONSTANT;
} else {
push_vector.x = 0.0;
push_vector.y = 0.0;
@ -199,12 +194,12 @@ void push_ui_snow(const TVector2i& pos) {
// tux particles
// ====================================================================
#define MAX_PARTICLES 500000
#define MAX_PARTICLES 10000
#define START_RADIUS 0.04
#define OLD_PART_SIZE 0.12 // orig 0.07
#define NEW_PART_SIZE 0.035 // orig 0.02
#define MIN_AGE -0.2
#define MAX_AGE 1.0
#define MIN_AGE -0.2
#define MAX_AGE 1.0
#define VARIANCE_FACTOR 0.8
#define PARTICLE_SHADOW_HEIGHT 0.05
#define PARTICLE_SHADOW_ALPHA 0.1
@ -291,8 +286,7 @@ void Particle::draw_billboard(const CControl *ctrl, double width, double height,
z_vec.z = ctrl->view_mat[2][2];
}
TVector3d pt1 = pt + -width/2.0 * x_vec;
pt1 += -height / 2.0 * y_vec;
TVector3d pt1 = pt - width/2.0 * x_vec - height/2.0 * y_vec;
TVector3d pt2 = pt1 + width * x_vec;
TVector3d pt3 = pt2 + height * y_vec;
TVector3d pt4 = pt3 + -width * x_vec;
@ -314,13 +308,13 @@ void Particle::draw_billboard(const CControl *ctrl, double width, double height,
glDisableClientState(GL_VERTEX_ARRAY);
}
void create_new_particles(const TVector3d& loc, const TVector3d& vel, int num) {
void create_new_particles(const TVector3d& loc, const TVector3d& vel, std::size_t num) {
double speed = vel.Length();
if (particles.size() + num > MAX_PARTICLES) {
Message("maximum number of particles exceeded");
}
for (int i=0; i<num; i++) {
for (std::size_t i=0; i<num; i++) {
particles.emplace_back();
Particle* newp = &particles.back();
newp->pt.x = loc.x + 2.*(FRandom() - 0.5) * START_RADIUS;
@ -347,7 +341,8 @@ void update_particles(float time_step) {
p->pt += static_cast<double>(time_step) * p->vel;
double ycoord = Course.FindYCoord(p->pt.x, p->pt.z);
if (p->pt.y < ycoord - 3) {p->age = p->death + 1;}
if (p->pt.y < ycoord - 3)
p->age = p->death + 1;
if (p->age >= p->death) {
p = particles.erase(p);
continue;
@ -433,10 +428,8 @@ void generate_particles(const CControl *ctrl, double dtime, const TVector3d& pos
right_part_vel *= std::min(MAX_PARTICLE_SPEED, speed * PARTICLE_SPEED_MULTIPLIER);
create_new_particles(left_part_pt, left_part_vel,
(int)left_particles);
create_new_particles(right_part_pt, right_part_vel,
(int)right_particles);
create_new_particles(left_part_pt, left_part_vel, (std::size_t)left_particles);
create_new_particles(right_part_pt, right_part_vel, (std::size_t)right_particles);
}
}
@ -490,6 +483,7 @@ TFlakeArea::TFlakeArea(
maxSize = _maxSize;
speed = _speed;
rotate_flake = rotate;
left = right = bottom = top = front = back = 0.f;
flakes.resize(num_flakes);
}

View File

@ -46,8 +46,8 @@ void generate_particles(const CControl *ctrl, double dtime, const TVector3d& pos
struct TFlake {
TVector3d pt;
float size;
TVector3d vel;
float size;
const GLfloat* tex;
void Draw(const TPlane& lp, const TPlane& rp, bool rotate_flake, float dir_angle) const;

View File

@ -56,6 +56,8 @@ CControl::CControl() :
paddle_time = 0;
view_init = false;
finish_speed = 0;
viewmode = ABOVE;
}
// --------------------------------------------------------------------

View File

@ -98,7 +98,7 @@ class CSPList : public std::list<std::string> {
private:
bool fnewlineflag;
public:
CSPList(bool newlineflag = false);
explicit CSPList(bool newlineflag = false);
void Add(const std::string& line = emptyString);
void Add(std::string&& line);

View File

@ -408,7 +408,7 @@ void CCharShape::Draw() {
ScopedRenderMode rm(TUX);
glEnable(GL_NORMALIZE);
TCharNode *node = GetNode(0);
const TCharNode *node = GetNode(0);
if (node == nullptr) return;
DrawNodes(node);
@ -622,7 +622,7 @@ bool CCharShape::CheckPolyhedronCollision(const TCharNode *node, const TMatrix<4
}
bool CCharShape::CheckCollision(const TPolyhedron& ph) {
TCharNode *node = GetNode(0);
const TCharNode *node = GetNode(0);
if (node == nullptr) return false;
const TMatrix<4, 4>& identity = TMatrix<4, 4>::getIdentity();
return CheckPolyhedronCollision(node, identity, identity, ph);

View File

@ -33,8 +33,10 @@ TVector2i cursor_pos(0, 0);
CWinsys Winsys;
CWinsys::CWinsys()
: sfmlRenders(false)
, auto_resolution(800, 600) {
: numJoysticks(0)
, sfmlRenders(false)
, auto_resolution(800, 600)
, scale(1.f) {
for (unsigned int i = 0; i < 8; i++) {
if (sf::Joystick::isConnected(i))
numJoysticks++;