Subversion Repository Public Repository

Divide-Framework

This repository has no backups
This repository's network speed is throttled to 100KB/sec

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
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "Headers/Unit.h"
#include "Graphs/Headers/SceneGraphNode.h"
#include "Rendering/Headers/Framerate.h"
#include "Core/Math/Headers/Transform.h"

Unit::Unit(UnitType type, SceneGraphNode* const node) : _type(type),
													    _node(node),
													    _moveSpeed(1 metre),
													    _moveTolerance(0.1f),
													    _prevTime(0){}
Unit::~Unit(){}

/// Pathfinding, collision detection, animation playback should all be controlled from here
bool Unit::moveTo(const vec3<F32>& targetPosition){
	// We should always have a node
	assert(_node != NULL);
    WriteLock w_lock(_unitUpdateMutex);
	// We receive move request every frame for now (or every task tick)
	// Start plotting a course from our current position
	_currentPosition = _node->getTransform()->getPosition();
	_currentTargetPosition = targetPosition;

	if(_prevTime <= 0) 
		_prevTime = GETMSTIME();
	// Get current time in ms
	U32 currentTime = GETMSTIME();
	// figure out how many milliseconds have elapsed since last move time
    U32 timeDif = currentTime - _prevTime;
	CLAMP<U32>(timeDif, 0, timeDif);
	// 'moveSpeed' m/s = '0.001 * moveSpeed' m / ms
	// distance = timeDif * 0.001 * moveSpeed
	F32 moveDistance = _moveSpeed * (getMsToSec(timeDif));
	CLAMP<F32>(moveDistance, EPSILON, _moveSpeed);
	// apply framerate varyance
	moveDistance *= FRAME_SPEED_FACTOR;
	
    F32 xDelta = _currentTargetPosition.x - _currentPosition.x;
    F32 yDelta = _currentTargetPosition.y - _currentPosition.y;
	F32 zDelta = _currentTargetPosition.z - _currentPosition.z;

    bool returnValue = IS_ZERO(_moveSpeed);
	if(!returnValue){
		// Compute the destination point for current frame step
		vec3<F32> interpPosition;
		if(!IS_TOLERANCE(yDelta,_moveTolerance) && !IS_ZERO( yDelta ) )
			interpPosition.y = ( _currentPosition.y > _currentTargetPosition.y ? -moveDistance : moveDistance );
	
		if((!IS_TOLERANCE(xDelta,_moveTolerance) || !IS_TOLERANCE(zDelta,_moveTolerance))) {
			// Update target
			if( IS_ZERO( xDelta ) ){
				interpPosition.z = ( _currentPosition.z > _currentTargetPosition.z ? -moveDistance : moveDistance );
			}else if( IS_ZERO( zDelta ) ){
				interpPosition.x = ( _currentPosition.x > _currentTargetPosition.x ? -moveDistance : moveDistance );
			}else if( fabs( xDelta ) > fabs( zDelta ) ) {
				F32 value = fabs( zDelta / xDelta ) * moveDistance;
				interpPosition.z = ( _currentPosition.z > _currentTargetPosition.z ? -value : value );
				interpPosition.x = ( _currentPosition.x > _currentTargetPosition.x ? -moveDistance : moveDistance );
			}else {
				F32 value = fabs( xDelta / zDelta ) * moveDistance;
				interpPosition.x = ( _currentPosition.x > _currentTargetPosition.x ? -value : value );
				interpPosition.z = ( _currentPosition.z > _currentTargetPosition.z ? -moveDistance : moveDistance );
			}
			// commit transformations
			_node->getTransform()->translate(interpPosition);
			// Update current position
			_currentPosition = _node->getTransform()->getPosition();
		}
    }
    // update previous time
	_prevTime = currentTime;

    return returnValue;
}

/// Move along the X axis
bool Unit::moveToX(const F32 targetPosition){
	/// Update current position
	WriteLock w_lock(_unitUpdateMutex);
	_currentPosition = _node->getTransform()->getPosition();
	w_lock.unlock();
	return moveTo(vec3<F32>(targetPosition,_currentPosition.y,_currentPosition.z));
}
/// Move along the Y axis
bool Unit::moveToY(const F32 targetPosition){
	/// Update current position
	WriteLock w_lock(_unitUpdateMutex);
	_currentPosition = _node->getTransform()->getPosition();
	w_lock.unlock();
	return moveTo(vec3<F32>(_currentPosition.x,targetPosition,_currentPosition.z));
}
/// Move along the Z axis
bool Unit::moveToZ(const F32 targetPosition){
	/// Update current position
	WriteLock w_lock(_unitUpdateMutex);
	_currentPosition = _node->getTransform()->getPosition();
	w_lock.unlock();
	return moveTo(vec3<F32>(_currentPosition.x,_currentPosition.y,targetPosition));
}

/// Further improvements may imply a cooldown and collision detection at destination (thus the if-check at the end)
bool Unit::teleportTo(const vec3<F32>& targetPosition){
	/// We should always have a node
	assert(_node != NULL);
	WriteLock w_lock(_unitUpdateMutex);
	/// We receive move request every frame for now (or every task tick)
	/// Check if the current request is already processed
	if(!_currentTargetPosition.compare(targetPosition,0.00001f)){
		/// Update target
		_currentTargetPosition = targetPosition;
	}

	/// Start plotting a course from our current position
	_currentPosition = _node->getTransform()->getPosition();
	/// teleport to desired position
	_node->getTransform()->setPosition(_currentTargetPosition);
	/// Update current position
	_currentPosition = _node->getTransform()->getPosition();
	/// And check if we arrived
	if(_currentTargetPosition.compare(_currentPosition,0.0001f)){
		return true; ///< yes
	}

	return false; ///< no
}

Commits for Divide-Framework/trunk/Source Code/Dynamics/Entities/Units/Unit.cpp

Diff revisions: vs.
Revision Author Commited Message
168 Diff Diff k1ngp1n picture k1ngp1n Sat 26 Oct, 2013 19:03:21 +0000

- Reworked the Camera class[[BR]]
— Now fully quaternion based [[BR]]
— Basic camera types added but not used yet (third person, first person, orbit) [[BR]]
- Cleaned up Material and Texture handling [[BR]]
- Added clipping plane support [[BR]]
— Similar to OpenGL fixed-function clip planes but fully shader driven [[BR]]
— Added a new class, “Plane”, that helps define clip planes [[BR]]
- Optimized the Singleton class to allow faster “getInstance” calls without performance penalties [[BR]]
-- “createInstance” must be called for each singleton class before usage. Or “gerOrCreateInstance” can be used, which is basically the former “getInstance” implementation [[BR]]
- Improved console logging by changing some heap allocations to stack and removing dependencies on the std::string class [[BR]]
- Added a lot of performance optimizations related to coding standards and redundant calculations [[BR]]
— e.g. Frustum AABB check didn’t need to recompute the AABB points as they were calculated already [[BR]]
— e.g. A vector did not need to be set to 0 on initialization as that is already it’s default state on creation [[BR]]
— e.g. Faster Framerate and Timing calculations by using less member variables that are not needed outsied of calling functions [[BR]]
- The SceneState now contains the SceneRenderState and is passed on to the SceneGraph’s update calls [[BR]]
- Better material export/import to/from XML format [[BR]]
- More bug fixes and cleanups [[BR]]

152 Diff Diff k1ngp1n picture k1ngp1n Thu 20 Jun, 2013 14:23:31 +0000

[Ionut] [[BR]]
- New rendering pipeline (experimental and unstable): [[BR]]
— OpenGL 3.x clean context (glLight commands are still used for now, but UBO support is there, but not used yet) [[BR]]
— Custom matrix stacks and UBO based shader data (UBOs cause some link errors on some nVidia cards)[[BR]]
— Multi-threaded texture loading and shader compilation (mt shader compilation disabled for now. needs more tests) [[BR]]
— VAO rendering is self contained (no more enable/disable calls before a draw request) [[BR]]
— Render instance class used for rendering information [[BR]]
[[BR]]
- New unique ID generation base class: GUIDWrapper. Each class that derives from this, gets an application wide unique id on construction [[BR]]
- Added base code for an in-game editor using CEGUI [[BR]]
- Replaced some mutex locks with lockless data structures or atomic data [[BR]]
- CEGUI 0.8.2, FTGL-GL3 and GLIM 0.4 modified to support GLEW_MX if defined [[BR]]
- Dropped VS2008 support [[BR]]
- Networking library, server framework and ReCast files are now projects inside the Divide Framework solution [[BR]]
- New console command “setFov” that modifies the horizontal FoV value in realtime [[BR]]
- New console command “recompileShader” that reparses shader files, recompiles shaders and relinks shader programs who’s names match or contain the argument string [[BR]]
- New debug utility: axis angle drawn in corner of the screen if needed [[BR]]
- More ‘const’-s pasted around the code, more loop performance tweaks (allocations before a loop, tighter loops, etc), more utility member functions added to various classes [[BR]]

151 Diff Diff k1ngp1n picture k1ngp1n Tue 07 May, 2013 00:00:52 +0000

[Ionut] [[BR]]
- Better ReCast integration [[BR]]
— Any entity can be used as an obstacle in the NavMesh if that’s specified in each scene’s assets.xml file for said entity [[BR]]
— New console command, “createNavMesh”, that passes geometry data to ReCast [[BR]]
-— NavMesh generation is not yet complete [[BR]]
- Better PhysX integration [[BR]]
— Each scene passes data to and gets data from the Physics API better and safer[[BR]]
- Multi-threaded support extended: [[BR]]
— Event class replaced with Task [[BR]]
— Kernel uses a threadpool for scene tasks [[BR]]
— Each task can be added to a different threadpool if needed [[BR]]
— Most critical sections use the new boost::atomic wrapper for thread safety [[BR]]
- Rendering system updated [[BR]]
— VBO’s keep track of the geometry type internally [[BR]]
— Rendering by specific element list is internal to the VBO [[BR]]
— VBO’s can draw a “lite” version that doesn’t send Tangent, BiTangent and TexCoord data for depth rendering (disabled) [[BR]]
- Reflectors now offer a preview of the generated reflective texture if needed [[BR]]
- Buttons are now added and rendered by CEGUI [[BR]]
[[BR]]
Deprecation: [[BR]]
- Removed fixed pipeline material system [[BR]]
- Removed BoundingBox late update system [[BR]]
- Shadow references in the material system are now depth references [[BR]]
[[BR]]
Bug fixes: [[BR]]
- Problematic FBO double bind check removed [[BR]]
- Faster terrain rendering via chunk size selection through each scene’s terrain.xml[[BR]]
- Rendering is paused when the window is minimized [[BR]]
- CEGUI and impostors now render properly in deferred rendering mode [[BR]]
- Fixed various level 4 (VS2008) warnings [[BR]]
- Better state management and cleaning [[BR]]
- Better SceneGraph node management and trasformation/AABB update calls [[BR]]
- AITenisScene has proper collisions now [[BR]]

149 Diff Diff k1ngp1n picture k1ngp1n Sun 21 Apr, 2013 21:38:05 +0000

[Ionut] [[BR]]
- Major GUI revamp: [[BR]]
— Fixed CEGUI rendering (invalid state reset after VBO/VAO unbind) [[BR]]
— Added a working Console window with a basic command parser [[BR]]
— GUI inputs take priority over scene (e.g. pressing a key in the console, does not affect the scene)[[BR]]
— Added AutoKey repeat [[BR]]
— Added config options for the GUI [[BR]]
- Revamped OpenGL Vertex Array Object class [[BR]]
— VBO’s without a shader attached will not use VAO’s [[BR]]
— VAO’s and VBO’s cleanup all states after them [[BR]]
- Added multiple Joystick support [[BR]]
- FrameBufferObject take in account the combination of texture id and bind slot when checking for double binds [[BR]]
- Upgraded Framerate/timing system [[BR]]
- Fixed Deferred rendering (typo in normal buffer creation) [[BR]]
- Fixed initial camera placement via scene config (RotateX(Y) replace with setAngleX(Y)) on camera init) [[BR]]
- Added better thread deletion in Event class [[BR]]
- Major mutex/semaphore/shared_lock rework in threaded classes [[BR]]
- Better A.I. initialization/destruction [[BR]]
- Fixed a typo in window positioning [[BR]]
- Better Unit movement code [[BR]]

146 Diff Diff k1ngp1n picture k1ngp1n Wed 10 Apr, 2013 13:20:15 +0000

[Ionut] [[BR]]
*Final LightBranch updates 2/3 : Main trunk merge and build test (VC90, VC100, gDebugger) [[BR]]
-Merged light branch with trunk [[BR]]
-Deleted light branch [[BR]]

113 Diff Diff k1ngp1n picture k1ngp1n Fri 01 Jun, 2012 16:51:23 +0000

[Ionut] [[BR]]
-Fixed animated bounding box calculations[[BR]]
-BoundingBox recalculation per frame is now a general SceneNode property [[BR]]
--Note: Animated BB’s have problems with multi-threaded collision detection for now (see AITenisScene) [[BR]]
-Wrapped boost::mutex to separate file and moved it to shared_mutex structure as read requests are more frequent than write requests [[BR]]
-Mesh class now calls animations update on all of it’s subclasses so animations for each node in a mesh are in sync [[BR]]
-Split up GUI elements by class [[BR]]
-Added base code for a console GUI element (disabled) [[BR]]
-Animations can now be disabled in confg file [[BR]]
-Added a “texture not found” default texture [[BR]]
-Some AI rewrite in AITenisScene (translation to english in next commit) [[BR]]
-Inlines, const’s, cleanups, etc [[BR]]

106 Diff Diff k1ngp1n picture k1ngp1n Wed 28 Mar, 2012 21:50:23 +0000

[Ionut] [[BR]]
Unstable revision – New animation code is not yet optimized and loading performance is low [[BR]]
[[BR]]
-Added animation loading and bone matrix calculations (actual skinning not implemented yet)[[BR]]
-Modified VBO classes to support dynamic data and faster updates [[BR]]
-Templatized Math classes (vec2,vec3,vec4,mat3,mat4) for greater flexibility [[BR]]
-Separated Rendering API from Rendering API version [[BR]]
-Fixed buggy GL error checking [[BR]]
-Small bugs fixed in Projectile and Weapon classes [[BR]]

104 k1ngp1n picture k1ngp1n Tue 13 Mar, 2012 19:33:49 +0000

[Ionut] [[BR]]
-Added base classes for the game logic part of the framework (just the backbone. main logic will be added iteratively): [[BR]]
--Unit class and it’s derived classes: Character [with derived: Player, NPC] and Vehicle [[BR]]
--Particle system: ParticleEmitter and Particle (with ParticleEmitterDescriptor and ParticleDescriptor) [[BR]]
--Triggers (launches an event when a unit is in range of it’s influence sphere) [[BR]]
--Weapon System: Weapon class, Projectile class and Ammunition class [[BR]]
[[BR]]
Improvements: [[BR]]
-Added more defines and template inline functions to help with various operations (integer bit conversion, XYZ to XZY coordinate conversion etc) [[BR]]
-Removed LightImpostor class and added a global Impostor class now used by lights, triggers and particle emitters [[BR]]
[[BR]]
Bug fixes: [[BR]]
-Removed some (weird) characters added by accident from terrain shader [[BR]]
-Use sqrtf for Floats and sqrt for Doubles[[BR]]