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.h"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#include "rayobject_hint.h"
|
||||||
#include "reorganize.h"
|
#include "reorganize.h"
|
||||||
#include "bvh.h"
|
#include "bvh.h"
|
||||||
#include <queue>
|
#include <queue>
|
||||||
@@ -331,25 +332,25 @@ int intersect(BVHTree *obj, Isect* isec)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Node>
|
template<class Node,class HintObject>
|
||||||
void bvh_dfs_make_hint(Node *node, LCTSHint *hint, int reserve_space, float *min, float *max);
|
void bvh_dfs_make_hint(Node *node, LCTSHint *hint, int reserve_space, HintObject *hintObject);
|
||||||
|
|
||||||
template<class Node>
|
template<class Node,class HintObject>
|
||||||
void bvh_dfs_make_hint_push_siblings(Node *node, LCTSHint *hint, int reserve_space, float *min, float *max)
|
void bvh_dfs_make_hint_push_siblings(Node *node, LCTSHint *hint, int reserve_space, HintObject *hintObject)
|
||||||
{
|
{
|
||||||
if(!RayObject_isAligned(node))
|
if(!RayObject_isAligned(node))
|
||||||
hint->stack[hint->size++] = (RayObject*)node;
|
hint->stack[hint->size++] = (RayObject*)node;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(node->sibling)
|
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>
|
template<class Node,class HintObject>
|
||||||
void bvh_dfs_make_hint(Node *node, LCTSHint *hint, int reserve_space, float *min, float *max)
|
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 );
|
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);
|
int childs = count_childs(node);
|
||||||
if(hint->size + reserve_space + childs <= RE_RAY_LCTS_MAX_SIZE)
|
if(hint->size + reserve_space + childs <= RE_RAY_LCTS_MAX_SIZE)
|
||||||
{
|
{
|
||||||
/* We are 100% sure the ray will be pass inside this node */
|
int result = hint_test_bb(hintObject, node->bb, node->bb+3);
|
||||||
if(bb_fits_inside(node->bb, node->bb+3, min, max) )
|
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;
|
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>
|
template<class Tree>
|
||||||
void bvh_hint_bb(Tree *tree, LCTSHint *hint, float *min, float *max)
|
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;
|
hint->size = 0;
|
||||||
bvh_dfs_make_hint( tree->root, hint, 0, min, max );
|
bvh_dfs_make_hint( tree->root, hint, 0, &bb );
|
||||||
tot_hints++;
|
tot_hints++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user