123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- // Copyright 2009-2021 Intel Corporation
- // SPDX-License-Identifier: Apache-2.0
- #pragma once
- #include "../geometry/primitive.h"
- #include "bspline_patch.h"
- #include "bezier_patch.h"
- #include "gregory_patch.h"
- #include "gregory_patch_dense.h"
- #include "tessellation.h"
- #include "tessellation_cache.h"
- #include "gridrange.h"
- #include "patch_eval_grid.h"
- #include "feature_adaptive_eval_grid.h"
- #include "../common/scene_subdiv_mesh.h"
- namespace embree
- {
- struct __aligned(64) SubdivPatch1Base
- {
- public:
- enum Type {
- INVALID_PATCH = 0,
- BSPLINE_PATCH = 1,
- BEZIER_PATCH = 2,
- GREGORY_PATCH = 3,
- EVAL_PATCH = 5,
- BILINEAR_PATCH = 6,
- };
- enum Flags {
- TRANSITION_PATCH = 16,
- };
- /*! Default constructor. */
- __forceinline SubdivPatch1Base () {}
- SubdivPatch1Base (const unsigned int gID,
- const unsigned int pID,
- const unsigned int subPatch,
- const SubdivMesh *const mesh,
- const size_t time,
- const Vec2f uv[4],
- const float edge_level[4],
- const int subdiv[4],
- const int simd_width);
- __forceinline bool needsStitching() const {
- return flags & TRANSITION_PATCH;
- }
- __forceinline Vec2f getUV(const size_t i) const {
- return Vec2f((float)u[i],(float)v[i]) * (8.0f/0x10000);
- }
- static void computeEdgeLevels(const float edge_level[4], const int subdiv[4], float level[4]);
- static Vec2i computeGridSize(const float level[4]);
- bool updateEdgeLevels(const float edge_level[4], const int subdiv[4], const SubdivMesh *const mesh, const int simd_width);
- public:
- __forceinline size_t getGridBytes() const {
- const size_t grid_size_xyzuv = (grid_size_simd_blocks * VSIZEX) * 4;
- return 64*((grid_size_xyzuv+15) / 16);
- }
- __forceinline void write_lock() { mtx.lock(); }
- __forceinline void write_unlock() { mtx.unlock(); }
- __forceinline bool try_write_lock() { return mtx.try_lock(); }
- //__forceinline bool try_read_lock() { return mtx.try_read_lock(); }
- __forceinline void resetRootRef() {
- //assert( mtx.hasInitialState() );
- root_ref = SharedLazyTessellationCache::Tag();
- }
- __forceinline SharedLazyTessellationCache::CacheEntry& entry() {
- return (SharedLazyTessellationCache::CacheEntry&) root_ref;
- }
- public:
- __forceinline unsigned int geomID() const {
- return geom;
- }
- __forceinline unsigned int primID() const {
- return prim;
- }
- public:
- SharedLazyTessellationCache::Tag root_ref;
- SpinLock mtx;
- unsigned short u[4]; //!< 16bit discretized u,v coordinates
- unsigned short v[4];
- float level[4];
- unsigned char flags;
- unsigned char type;
- unsigned short grid_u_res;
- unsigned int geom; //!< geometry ID of the subdivision mesh this patch belongs to
- unsigned int prim; //!< primitive ID of this subdivision patch
- unsigned short grid_v_res;
- unsigned short grid_size_simd_blocks;
- unsigned int time_;
- struct PatchHalfEdge {
- const HalfEdge* edge;
- unsigned subPatch;
- };
- Vec3fa patch_v[4][4];
- const HalfEdge *edge() const { return ((PatchHalfEdge*)patch_v)->edge; }
- unsigned time() const { return time_; }
- unsigned subPatch() const { return ((PatchHalfEdge*)patch_v)->subPatch; }
- void set_edge(const HalfEdge *h) const { ((PatchHalfEdge*)patch_v)->edge = h; }
- void set_subPatch(const unsigned s) const { ((PatchHalfEdge*)patch_v)->subPatch = s; }
- };
- namespace isa
- {
- Vec3fa patchEval(const SubdivPatch1Base& patch, const float uu, const float vv);
- Vec3fa patchNormal(const SubdivPatch1Base& patch, const float uu, const float vv);
-
- template<typename simdf>
- Vec3<simdf> patchEval(const SubdivPatch1Base& patch, const simdf& uu, const simdf& vv);
- template<typename simdf>
- Vec3<simdf> patchNormal(const SubdivPatch1Base& patch, const simdf& uu, const simdf& vv);
-
- /* eval grid over patch and stich edges when required */
- void evalGrid(const SubdivPatch1Base& patch,
- const unsigned x0, const unsigned x1,
- const unsigned y0, const unsigned y1,
- const unsigned swidth, const unsigned sheight,
- float *__restrict__ const grid_x,
- float *__restrict__ const grid_y,
- float *__restrict__ const grid_z,
- float *__restrict__ const grid_u,
- float *__restrict__ const grid_v,
- const SubdivMesh* const geom);
- /* eval grid over patch and stich edges when required */
- BBox3fa evalGridBounds(const SubdivPatch1Base& patch,
- const unsigned x0, const unsigned x1,
- const unsigned y0, const unsigned y1,
- const unsigned swidth, const unsigned sheight,
- const SubdivMesh* const geom);
- }
- }
|