generic hints for raytracer

for now only BB hint (i am  hoping to find a decent frustum-test)
This commit is contained in:
2009-08-05 12:44:11 +00:00
parent 2160f36fea
commit bbdba89d06
2 changed files with 84 additions and 13 deletions

View File

@@ -0,0 +1,65 @@
/**
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* 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 2
* 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* 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, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* The Original Code is Copyright (C) 2009 Blender Foundation.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): André Pinto.
*
* ***** END GPL LICENSE BLOCK *****
*/
#define HINT_RECURSE 1
#define HINT_ACCEPT 0
#define HINT_DISCARD -1
struct HintBB
{
float bb[6];
};
inline int hint_test_bb(HintBB *obj, float *Nmin, float *Nmax)
{
if(bb_fits_inside( Nmin, Nmax, obj->bb, obj->bb+3 ) )
return HINT_RECURSE;
else
return HINT_ACCEPT;
}
/*
struct HintFrustum
{
float co[3];
float no[4][3];
};
inline int hint_test_bb(HintFrustum &obj, float *Nmin, float *Nmax)
{
//if frustum inside BB
{
return HINT_RECURSE;
}
//if BB outside frustum
{
return HINT_DISCARD;
}
return HINT_ACCEPT;
}
*/

View File

@@ -38,6 +38,7 @@ extern "C"
#include "rayobject.h"
};
#include "rayobject_hint.h"
#include "reorganize.h"
#include "bvh.h"
#include <queue>
@@ -331,25 +332,25 @@ int intersect(BVHTree *obj, Isect* isec)
}
}
template<class Node>
void bvh_dfs_make_hint(Node *node, LCTSHint *hint, int reserve_space, float *min, float *max);
template<class Node,class HintObject>
void bvh_dfs_make_hint(Node *node, LCTSHint *hint, int reserve_space, HintObject *hintObject);
template<class Node>
void bvh_dfs_make_hint_push_siblings(Node *node, LCTSHint *hint, int reserve_space, float *min, float *max)
template<class Node,class HintObject>
void bvh_dfs_make_hint_push_siblings(Node *node, LCTSHint *hint, int reserve_space, HintObject *hintObject)
{
if(!RayObject_isAligned(node))
hint->stack[hint->size++] = (RayObject*)node;
else
{
if(node->sibling)
bvh_dfs_make_hint_push_siblings(node->sibling, hint, reserve_space+1, min, max);
bvh_dfs_make_hint_push_siblings(node->sibling, hint, reserve_space+1, hintObject);
bvh_dfs_make_hint(node, hint, reserve_space, min, max);
bvh_dfs_make_hint(node, hint, reserve_space, hintObject);
}
}
template<class Node>
void bvh_dfs_make_hint(Node *node, LCTSHint *hint, int reserve_space, float *min, float *max)
template<class Node,class HintObject>
void bvh_dfs_make_hint(Node *node, LCTSHint *hint, int reserve_space, HintObject *hintObject)
{
assert( hint->size + reserve_space + 1 <= RE_RAY_LCTS_MAX_SIZE );
@@ -362,12 +363,13 @@ void bvh_dfs_make_hint(Node *node, LCTSHint *hint, int reserve_space, float *min
int childs = count_childs(node);
if(hint->size + reserve_space + childs <= RE_RAY_LCTS_MAX_SIZE)
{
/* We are 100% sure the ray will be pass inside this node */
if(bb_fits_inside(node->bb, node->bb+3, min, max) )
int result = hint_test_bb(hintObject, node->bb, node->bb+3);
if(result == HINT_RECURSE)
{
bvh_dfs_make_hint_push_siblings(node->child, hint, reserve_space, min, max);
/* We are 100% sure the ray will be pass inside this node */
bvh_dfs_make_hint_push_siblings(node->child, hint, reserve_space, hintObject);
}
else
else if(result == HINT_ACCEPT)
{
hint->stack[hint->size++] = (RayObject*)node;
}
@@ -382,8 +384,12 @@ void bvh_dfs_make_hint(Node *node, LCTSHint *hint, int reserve_space, float *min
template<class Tree>
void bvh_hint_bb(Tree *tree, LCTSHint *hint, float *min, float *max)
{
HintBB bb;
VECCOPY(bb.bb, min);
VECCOPY(bb.bb+3, max);
hint->size = 0;
bvh_dfs_make_hint( tree->root, hint, 0, min, max );
bvh_dfs_make_hint( tree->root, hint, 0, &bb );
tot_hints++;
}