Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Fetching contributors…
Cannot retrieve contributors at this time
256 lines (167 sloc) 5.59 KB
Copyright (C) 2009 Andrew Caudwell (
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version
3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <>.
#ifndef RDIRNODE_H
#define RDIRNODE_H
#include "core/sdlapp.h"
#include "core/bounds.h"
#include "core/quadtree.h"
#include "core/pi.h"
#include "core/vbo.h"
#include "gource_settings.h"
#include "spline.h"
#include "file.h"
#include "bloom.h"
#include <list>
#include <set>
class RFile;
class RDirNode : public QuadItem {
std::string abspath;
std::string path_token;
int path_token_offset;
RDirNode* parent;
std::list<RDirNode*> children;
std::list<RFile*> files;
SplineEdge spline;
vec4 col;
vec2 spos;
vec2 projected_pos;
vec2 projected_spos;
vec2 pos;
vec2 vel;
vec2 accel, prev_accel;
float dir_area;
bool visible;
bool in_frustum;
bool position_initialized;
float since_node_visible;
float since_last_file_change;
float since_last_node_change;
float file_area;
float dir_radius;
float dir_radius_sqrt;
float parent_radius;
int depth;
int visible_count;
vec3 screenpos;
vec2 node_normal;
void calcRadius();
void calcColour();
std::string commonPathPrefix(const std::string& str) const;
void changePath(const std::string & abspath);
void setInitialPosition();
void drawEdge(RDirNode* child) const;
void updateSplinePoint(float dt);
void move(float dt);
vec2 calcFileDest(int layer_no, int file_no);
void updateFilePositions();
void adjustPath();
void drawDirName(FXFont& dirfont) const;
RDirNode(RDirNode* parent, const std::string & abspath);
void printFiles();
bool empty() const;
bool isAnchor(RDirNode* node) const;
RDirNode* getRoot();
void fileUpdated(bool userInitiated);
void nodeUpdated(bool userInitiated);
void addVisible();
bool isVisible();
float getArea() const;
int totalDirCount() const;
int totalFileCount() const;
int getTokenOffset() const;
int dirCount() const;
int fileCount() const;
int visibleFileCount() const;
bool noDirs() const;
bool noFiles() const;
bool prefixedBy(const std::string & path) const;
const std::string & getPath() const;
const vec2 & getNodeNormal() const;
bool isParent(RDirNode* node) const;
bool addFile(RFile* f);
bool removeFile(RFile* f);
int getDepth() const;
const std::list<RDirNode*> & getChildren() const;
void updateQuadItemBounds();
float getParentRadius() const;
float getRadius() const;
float getRadiusSqrt() const;
const std::list<RFile*>* getFiles() const { return &files; };
void getFilesRecursive(std::list<RFile*>& files) const;
vec3 averageFileColour() const;
const vec4 & getColour() const;
RDirNode* getParent() const;
bool isDir(const std::string& path) const;
void findDirs(const std::string& path, std::list<RDirNode*>& dirs);
const vec2 & getPos() const;
void calcEdges();
const vec2 & getProjectedPos() const;
const vec2 & getSPos() const;
void setPos(const vec2 & pos);
void rotate(float s, float c);
void setParent(RDirNode* parent);
float distanceToParent() const;
void addNode(RDirNode* node);
void debug(int indent=0) const;
void applyForceDir(RDirNode* dir);
void applyForces(QuadTree &quadtree);
void logic(float dt);
void updateEdgeVBO(quadbuf& buffer) const;
void drawEdges() const;
void drawEdgeShadows() const;
void checkFrustum(const Frustum & frustum);
void updateFilesVBO(quadbuf& buffer, float dt) const;
void updateBloomVBO(bloombuf& buffer, float dt);
void drawShadows(float dt) const;
void drawFiles(float dt) const;
void drawBloom(float dt);
void drawNames(FXFont& dirfont);
void calcScreenPos(GLint* viewport, GLdouble* modelview, GLdouble* projection);
void nodeCount() const;
class DirForceFunctor : public VisitFunctor<QuadItem>{
RDirNode * this_dir;
std::set<RDirNode*> seen;
size_t loopCount;
DirForceFunctor(RDirNode * dir) : this_dir(dir), seen(), loopCount(0){}
int getLoopCount() const{ return loopCount; }
void operator()(QuadItem * item){
std::set<RDirNode*>::iterator seentest;
RDirNode* d = (RDirNode*) (item);
if(d==this_dir) return;
if(d==this_dir->getParent()) return;
if(d->getParent() == this_dir) return;
if(this_dir->isParent(d)) return;
if(d->isParent(this_dir)) return;
if(d->node_count != 1) {
if((seentest = seen.find(d)) != seen.end())
extern int gGourceDirNodeInnerLoops;
extern int gGourceFileInnerLoops;
extern float gGourcePointSize;
extern bool gGourceNodeDebug;
extern bool gGourceGravity;
extern float gGourceForceGravity;
extern std::map<std::string, RDirNode*> gGourceDirMap;
Jump to Line
Something went wrong with that request. Please try again.