Path: blob/master/thirdparty/embree/kernels/geometry/curveNv.h
9905 views
// Copyright 2009-2021 Intel Corporation1// SPDX-License-Identifier: Apache-2.023#pragma once45#include "curveNi.h"67namespace embree8{9template<int M>10struct CurveNv : public CurveNi<M>11{12using CurveNi<M>::N;1314struct Type : public PrimitiveType {15const char* name() const;16size_t sizeActive(const char* This) const;17size_t sizeTotal(const char* This) const;18size_t getBytes(const char* This) const;19};20static Type type;2122public:2324/* Returns maximum number of stored primitives */25static __forceinline size_t max_size() { return M; }2627/* Returns required number of primitive blocks for N primitives */28static __forceinline size_t blocks(size_t N) { return (N+M-1)/M; }2930static __forceinline size_t bytes(size_t N)31{32const size_t f = N/M, r = N%M;33static_assert(sizeof(CurveNv) == 22+25*M+4*16*M, "internal data layout issue");34return f*sizeof(CurveNv) + (r!=0)*(22 + 25*r + 4*16*r);35}3637public:3839/*! Default constructor. */40__forceinline CurveNv () {}4142/*! fill curve from curve list */43__forceinline void fill(const PrimRef* prims, size_t& begin, size_t _end, Scene* scene)44{45size_t end = min(begin+M,_end);46size_t N = end-begin;4748/* encode all primitives */49for (size_t i=0; i<N; i++)50{51const PrimRef& prim = prims[begin+i];52const unsigned int geomID = prim.geomID();53const unsigned int primID = prim.primID();54CurveGeometry* mesh = (CurveGeometry*) scene->get(geomID);55const unsigned vtxID = mesh->curve(primID);56Vec3fa::storeu(&this->vertices(i,N)[0],mesh->vertex(vtxID+0));57Vec3fa::storeu(&this->vertices(i,N)[1],mesh->vertex(vtxID+1));58Vec3fa::storeu(&this->vertices(i,N)[2],mesh->vertex(vtxID+2));59Vec3fa::storeu(&this->vertices(i,N)[3],mesh->vertex(vtxID+3));60}61}6263template<typename BVH, typename Allocator>64__forceinline static typename BVH::NodeRef createLeaf (BVH* bvh, const PrimRef* prims, const range<size_t>& set, const Allocator& alloc)65{66if (set.size() == 0)67return BVH::emptyNode;6869/* fall back to CurveNi for oriented curves */70unsigned int geomID = prims[set.begin()].geomID();71if (bvh->scene->get(geomID)->getCurveType() == Geometry::GTY_SUBTYPE_ORIENTED_CURVE) {72return CurveNi<M>::createLeaf(bvh,prims,set,alloc);73}74if (bvh->scene->get(geomID)->getCurveBasis() == Geometry::GTY_BASIS_HERMITE) {75return CurveNi<M>::createLeaf(bvh,prims,set,alloc);76}7778size_t start = set.begin();79size_t items = CurveNv::blocks(set.size());80size_t numbytes = CurveNv::bytes(set.size());81CurveNv* accel = (CurveNv*) alloc.malloc1(numbytes,BVH::byteAlignment);82for (size_t i=0; i<items; i++) {83accel[i].CurveNv<M>::fill(prims,start,set.end(),bvh->scene);84accel[i].CurveNi<M>::fill(prims,start,set.end(),bvh->scene);85}86return bvh->encodeLeaf((char*)accel,items);87};8889public:90unsigned char data[4*16*M];91__forceinline Vec3fa* vertices(size_t i, size_t N) { return (Vec3fa*)CurveNi<M>::end(N)+4*i; }92__forceinline const Vec3fa* vertices(size_t i, size_t N) const { return (Vec3fa*)CurveNi<M>::end(N)+4*i; }93};9495template<int M>96typename CurveNv<M>::Type CurveNv<M>::type;9798typedef CurveNv<4> Curve4v;99typedef CurveNv<8> Curve8v;100}101102103