Path: blob/master/thirdparty/embree/kernels/builders/splitter.h
9912 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#if !defined(RTHWIF_STANDALONE)6#include "../common/scene.h"7#endif89#include "../builders/primref.h"1011namespace embree12{13namespace isa14{15template<size_t N>16__forceinline void splitPolygon(const BBox3fa& bounds,17const size_t dim,18const float pos,19const Vec3fa (&v)[N+1],20BBox3fa& left_o,21BBox3fa& right_o)22{23BBox3fa left = empty, right = empty;24/* clip triangle to left and right box by processing all edges */25for (size_t i=0; i<N; i++)26{27const Vec3fa &v0 = v[i];28const Vec3fa &v1 = v[i+1];29const float v0d = v0[dim];30const float v1d = v1[dim];3132if (v0d <= pos) left. extend(v0); // this point is on left side33if (v0d >= pos) right.extend(v0); // this point is on right side3435if ((v0d < pos && pos < v1d) || (v1d < pos && pos < v0d)) // the edge crosses the splitting location36{37assert((v1d-v0d) != 0.0f);38const float inv_length = 1.0f/(v1d-v0d);39const Vec3fa c = madd(Vec3fa((pos-v0d)*inv_length),v1-v0,v0);40left.extend(c);41right.extend(c);42}43}4445/* clip against current bounds */46left_o = intersect(left,bounds);47right_o = intersect(right,bounds);48}4950template<size_t N>51__forceinline void splitPolygon(const BBox3fa& bounds,52const size_t dim,53const float pos,54const Vec3fa (&v)[N+1],55const Vec3fa (&inv_length)[N],56BBox3fa& left_o,57BBox3fa& right_o)58{59BBox3fa left = empty, right = empty;60/* clip triangle to left and right box by processing all edges */61for (size_t i=0; i<N; i++)62{63const Vec3fa &v0 = v[i];64const Vec3fa &v1 = v[i+1];65const float v0d = v0[dim];66const float v1d = v1[dim];6768if (v0d <= pos) left. extend(v0); // this point is on left side69if (v0d >= pos) right.extend(v0); // this point is on right side7071if ((v0d < pos && pos < v1d) || (v1d < pos && pos < v0d)) // the edge crosses the splitting location72{73assert((v1d-v0d) != 0.0f);74const Vec3fa c = madd(Vec3fa((pos-v0d)*inv_length[i][dim]),v1-v0,v0);75left.extend(c);76right.extend(c);77}78}7980/* clip against current bounds */81left_o = intersect(left,bounds);82right_o = intersect(right,bounds);83}8485template<size_t N>86__forceinline void splitPolygon(const PrimRef& prim,87const size_t dim,88const float pos,89const Vec3fa (&v)[N+1],90PrimRef& left_o,91PrimRef& right_o)92{93BBox3fa left = empty, right = empty;94for (size_t i=0; i<N; i++)95{96const Vec3fa &v0 = v[i];97const Vec3fa &v1 = v[i+1];98const float v0d = v0[dim];99const float v1d = v1[dim];100101if (v0d <= pos) left. extend(v0); // this point is on left side102if (v0d >= pos) right.extend(v0); // this point is on right side103104if ((v0d < pos && pos < v1d) || (v1d < pos && pos < v0d)) // the edge crosses the splitting location105{106assert((v1d-v0d) != 0.0f);107const float inv_length = 1.0f/(v1d-v0d);108const Vec3fa c = madd(Vec3fa((pos-v0d)*inv_length),v1-v0,v0);109left.extend(c);110right.extend(c);111}112}113114/* clip against current bounds */115new (&left_o ) PrimRef(intersect(left ,prim.bounds()),prim.geomID(), prim.primID());116new (&right_o) PrimRef(intersect(right,prim.bounds()),prim.geomID(), prim.primID());117}118119#if !defined(RTHWIF_STANDALONE)120121struct TriangleSplitter122{123__forceinline TriangleSplitter(const Scene* scene, const PrimRef& prim)124{125const unsigned int mask = 0xFFFFFFFF >> RESERVED_NUM_SPATIAL_SPLITS_GEOMID_BITS;126const TriangleMesh* mesh = (const TriangleMesh*) scene->get(prim.geomID() & mask );127TriangleMesh::Triangle tri = mesh->triangle(prim.primID());128v[0] = mesh->vertex(tri.v[0]);129v[1] = mesh->vertex(tri.v[1]);130v[2] = mesh->vertex(tri.v[2]);131v[3] = mesh->vertex(tri.v[0]);132inv_length[0] = Vec3fa(1.0f) / (v[1]-v[0]);133inv_length[1] = Vec3fa(1.0f) / (v[2]-v[1]);134inv_length[2] = Vec3fa(1.0f) / (v[0]-v[2]);135}136137__forceinline void operator() (const PrimRef& prim, const size_t dim, const float pos, PrimRef& left_o, PrimRef& right_o) const {138splitPolygon<3>(prim,dim,pos,v,left_o,right_o);139}140141__forceinline void operator() (const BBox3fa& prim, const size_t dim, const float pos, BBox3fa& left_o, BBox3fa& right_o) const {142splitPolygon<3>(prim,dim,pos,v,inv_length,left_o,right_o);143}144145private:146Vec3fa v[4];147Vec3fa inv_length[3];148};149150struct TriangleSplitterFactory151{152__forceinline TriangleSplitterFactory(const Scene* scene)153: scene(scene) {}154155__forceinline TriangleSplitter operator() (const PrimRef& prim) const {156return TriangleSplitter(scene,prim);157}158159private:160const Scene* scene;161};162163struct QuadSplitter164{165__forceinline QuadSplitter(const Scene* scene, const PrimRef& prim)166{167const unsigned int mask = 0xFFFFFFFF >> RESERVED_NUM_SPATIAL_SPLITS_GEOMID_BITS;168const QuadMesh* mesh = (const QuadMesh*) scene->get(prim.geomID() & mask );169QuadMesh::Quad quad = mesh->quad(prim.primID());170v[0] = mesh->vertex(quad.v[1]);171v[1] = mesh->vertex(quad.v[2]);172v[2] = mesh->vertex(quad.v[3]);173v[3] = mesh->vertex(quad.v[0]);174v[4] = mesh->vertex(quad.v[1]);175v[5] = mesh->vertex(quad.v[3]);176inv_length[0] = Vec3fa(1.0f) / (v[1] - v[0]);177inv_length[1] = Vec3fa(1.0f) / (v[2] - v[1]);178inv_length[2] = Vec3fa(1.0f) / (v[3] - v[2]);179inv_length[3] = Vec3fa(1.0f) / (v[4] - v[3]);180inv_length[4] = Vec3fa(1.0f) / (v[5] - v[4]);181}182183__forceinline void operator() (const PrimRef& prim, const size_t dim, const float pos, PrimRef& left_o, PrimRef& right_o) const {184splitPolygon<5>(prim,dim,pos,v,left_o,right_o);185}186187__forceinline void operator() (const BBox3fa& prim, const size_t dim, const float pos, BBox3fa& left_o, BBox3fa& right_o) const {188splitPolygon<5>(prim,dim,pos,v,inv_length,left_o,right_o);189}190191private:192Vec3fa v[6];193Vec3fa inv_length[5];194};195196struct QuadSplitterFactory197{198__forceinline QuadSplitterFactory(const Scene* scene)199: scene(scene) {}200201__forceinline QuadSplitter operator() (const PrimRef& prim) const {202return QuadSplitter(scene,prim);203}204205private:206const Scene* scene;207};208209210struct DummySplitter211{212__forceinline DummySplitter(const Scene* scene, const PrimRef& prim)213{214}215216__forceinline void operator() (const PrimRef& prim, const size_t dim, const float pos, PrimRef& left_o, PrimRef& right_o) const {217}218219__forceinline void operator() (const BBox3fa& prim, const size_t dim, const float pos, BBox3fa& left_o, BBox3fa& right_o) const {220}221222};223224struct DummySplitterFactory225{226__forceinline DummySplitterFactory(const Scene* scene)227: scene(scene) {}228229__forceinline DummySplitter operator() (const PrimRef& prim) const {230return DummySplitter(scene,prim);231}232233private:234const Scene* scene;235};236#endif237}238}239240241242