(Effectively a re-write of the MassCalculation code)
- renamed some mass calculator accesor methods
- MassData, InertiaMatrix refactored into 'RigidBody' class
- refactors out cache code to separate wrapper class
- calculations now use the Transform class to translate masses, CM, and MOI
- new class: MassCalculation
- contains relevant context for a given calculation: tree-root, type, time, config
- contains most actual calculation code
- calculations are tracked with a context class: MassCalculation
This is a relatively major refactor / rewrite of the 3d rendering code.
- components geometries are rendered recursively
- components inherit parents' transformations ( translation, rotation)
- implemented Transformation#toGLMatrix()
-- openrocket transformations can be directly fed into Java OpenGL
- added: FinSet#getBoundingBox()
- improved documentation on RocketComponent Location methods
- Refactor RocketRenderer:
- render component trees recursively
- removed RocketRendere#isDrawn(c) -- return true in all implementations
- Refactor ComponentRenderer
- renamed variables to be more descriptive
- changed RocketComponent#toAbsolute(...) => RocketComponent#getComponentLocations()
- Adjust FinRender Code:
- Render Single Fin Instance at-a-time
- takes in an angle for the instance
- assumes the fin is already at it's desired position.
- renames 'fs' -> 'finSet'
- moved 'instancecount' and 'instanceseparation' loading from CenteringRing to RadiusRingComponent
- enables both Bulkhead and CenteringRing to load those tags from .ork file
- Adjusted masscalculater code to not double-count instances (when mass > 0, and instance > 1 )
- RingComponents now correctly calculate their mass again
- introduced interfaces for different types of positionable components:
-- AnglePositionable
-- AxialPositionable
-- RadiusPositionable
- RingInstanceable now includes these other interfaces, making explicit the expectations of
any implementing subclass.
- RingInstanceable now indicates its angles as an array instead of returning angles one-at-a-time
-- commit includes updates to match this new API
- Added getAssembly() method to RocketComponent, to simplify instancing code
- The Rocket#trackStages function needs to handle being updated with the same stage id#, but different instance
- Rocket#update now updates the stageMap
- FlightConfigurations refactored to use stage numbers instead of references.
- conceptually, a rocket *IS A* ComponentAssembly.
- reduces code duplication: 7 redundant functions
- rocket still inherits all the RocketComponent methods
- Also: changed Coordinate.NUL -> Coordinate.ZERO to better reflect our intent.
-- Nitpick: Coordinate.NUL is *not* null. It's zero. These are different!
-- Null is an error condition.
-- Zero is a valid coordinate. Zero means something is located at the origin. Like the rocket, and the nosecone.