2013-11-11 14:42:11 +00:00
|
|
|
#include "FluidMediumManager.h"
|
|
|
|
|
|
|
|
#include "SoftwareRenderer.h"
|
|
|
|
#include "FluidMediumInterface.h"
|
2015-10-15 22:28:07 +00:00
|
|
|
#include "Color.h"
|
2013-11-11 14:42:11 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
FluidMediumManager::FluidMediumManager(SoftwareRenderer *renderer) : renderer(renderer) {
|
2013-11-11 14:42:11 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
FluidMediumManager::~FluidMediumManager() {
|
2013-11-11 14:42:11 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void FluidMediumManager::clearMedia() {
|
2013-11-11 14:42:11 +00:00
|
|
|
media.clear();
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void FluidMediumManager::registerMedium(FluidMediumInterface *medium) {
|
2013-11-11 14:42:11 +00:00
|
|
|
media.push_back(medium);
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
Color FluidMediumManager::applyTraversal(const Vector3 &eye, const Vector3 &location, const Color &color) const {
|
2013-11-11 14:42:11 +00:00
|
|
|
// Collect potential segments
|
|
|
|
SpaceSegment ray(eye, location);
|
|
|
|
int max_segments = media.size();
|
2015-11-09 21:30:46 +00:00
|
|
|
FluidMediumSegment *segments;
|
2013-11-11 14:42:11 +00:00
|
|
|
segments = new FluidMediumSegment[max_segments];
|
2015-08-13 21:59:27 +00:00
|
|
|
getTraversedMedia(segments, ray, max_segments);
|
2013-11-11 14:42:11 +00:00
|
|
|
|
|
|
|
delete[] segments;
|
|
|
|
return color;
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
int FluidMediumManager::getTraversedMedia(FluidMediumSegment segments[], const SpaceSegment &ray,
|
|
|
|
int max_segments) const {
|
2013-11-11 14:42:11 +00:00
|
|
|
int added = 0;
|
2015-11-09 21:30:46 +00:00
|
|
|
for (auto &medium : media) {
|
2013-11-11 14:42:11 +00:00
|
|
|
SpaceSegment ray_inter(ray);
|
2015-11-09 21:30:46 +00:00
|
|
|
if (added < max_segments and medium->checkInfluence(ray_inter)) {
|
2013-11-11 14:42:11 +00:00
|
|
|
// The medium intersect with the ray
|
|
|
|
segments[added++] = {medium, ray_inter};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return added;
|
|
|
|
}
|