generic hints for raytracer
for now only BB hint (i am hoping to find a decent frustum-test)
This commit is contained in:
65
source/blender/render/intern/raytrace/rayobject_hint.h
Normal file
65
source/blender/render/intern/raytrace/rayobject_hint.h
Normal 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;
|
||||
}
|
||||
*/
|
||||
@@ -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++;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user