123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- /*
- * DoRayMe - a quick and dirty Raytracer
- * WorldOptimiser implementation
- *
- * Created by Manoël Trapier
- * Copyright (c) 2020 986-Studio.
- *
- */
- #include <shape.h>
- #include <group.h>
- #include <objfile.h>
- #include <world.h>
- #include <worldoptimiser.h>
- /* This function is meant to move all infinite object to the root group */
- void WorldOptimiser::moveInfiniteObjects(Shape *s)
- {
- if (s == nullptr)
- {
- s = this->root;
- }
- if (s->getType() == Shape::OBJFILE)
- {
- /* Special case */
- OBJFile *obj = (OBJFile *)s;
- s = obj->getBaseGroup();
- }
- if (s->getType() == Shape::GROUP)
- {
- int i;
- Group *grp = (Group *)s;
- if (grp->getUnboxableCount() > 0)
- {
- for(i = 0; i < grp->getUnboxableCount(); i++)
- {
- Shape *shp = grp->getUnboxable(i);
- if (this->root != s)
- {
- if (shp->getType() == Shape::GROUP)
- {
- /* Issue a warning if it is a group */
- printf("WARNING: The group '%s' in '%s' have infinite bounds, all items part of it will not be optimised."
- "That may affect performances!",
- ((Group *)shp)->getName(),
- grp->getName());
- }
- this->root->addObject(shp);
- grp->removeObject(shp);
- /* We remove an object from that list, so need to do some stuffs. */
- i -= 1;
- }
- }
- }
- /* Now let's traverse the rest of that group */
- if (grp->getObjectCount() > 0)
- {
- for(i = 0; i < grp->getObjectCount(); i++)
- {
- Shape *shp = grp->getObject(i);
- this->moveInfiniteObjects(shp);
- }
- }
- }
- /* If it is not a group, there is nothing to be done there. */
- }
- void WorldOptimiser::moveAllObjects(Shape *s)
- {
- if (s == nullptr)
- {
- s = this->root;
- }
- if (s->getType() == Shape::OBJFILE)
- {
- /* Special case */
- OBJFile *obj = (OBJFile *)s;
- s = obj->getBaseGroup();
- }
- /* We should be here only when it is a group, but better being safe. */
- if (s->getType() == Shape::GROUP)
- {
- int i;
- Group *grp = (Group *)s;
- /* Now let's traverse the rest of that group */
- if (grp->getObjectCount() > 0)
- {
- for(i = 0; i < grp->getObjectCount(); i++)
- {
- Shape *shp = grp->getObject(i);
- switch(shp->getType())
- {
- default:
- /* Don't move if we are on the same leaf */
- if (this->root != s)
- {
- /* It is not a group type object so, move it! */
- this->root->addObject(shp);
- grp->removeObject(shp);
- /* We remove an object from that list, so need to do some stuffs. */
- i -= 1;
- }
- break;
- case Shape::GROUP:
- case Shape::OBJFILE:
- this->moveAllObjects(shp);
- }
- }
- }
- }
- /* If it is not a group, there is nothing to be done there. */
- }
|