void Geometry::disable () { if (parent->isStatic()) { process_error(RTC_INVALID_OPERATION,"static geometries cannot get disabled"); return; } if (isEnabled()) { atomic_sub(&parent->numIntersectionFilters4,(intersectionFilter4 != NULL) + (occlusionFilter4 != NULL)); atomic_sub(&parent->numIntersectionFilters8,(intersectionFilter8 != NULL) + (occlusionFilter8 != NULL)); atomic_sub(&parent->numIntersectionFilters16,(intersectionFilter16 != NULL) + (occlusionFilter16 != NULL)); } switch (state) { case ENABLING: state = DISABLED; disabling(); break; case ENABLED: state = DISABLING; disabling(); break; case MODIFIED: state = DISABLING; disabling(); break; case DISABLING: break; case DISABLED: break; case ERASING: break; } }
void Geometry::erase () { if (parent->isStatic()) { process_error(RTC_INVALID_OPERATION,"static geometries cannot get deleted"); return; } switch (state) { case ENABLING: state = ERASING; disabling(); break; case ENABLED: state = ERASING; disabling(); break; case MODIFIED: state = ERASING; disabling(); break; case DISABLING: state = ERASING; break; case DISABLED: state = ERASING; break; case ERASING: break; } }
void NativeCurves::setBuffer(RTCBufferType type, void* ptr, size_t offset, size_t stride, size_t size) { if (scene->isStatic() && scene->isBuild()) throw_RTCError(RTC_INVALID_OPERATION,"static geometries cannot get modified"); /* verify that all accesses are 4 bytes aligned */ if (((size_t(ptr) + offset) & 0x3) || (stride & 0x3)) throw_RTCError(RTC_INVALID_OPERATION,"data must be 4 bytes aligned"); unsigned bid = type & 0xFFFF; if (type >= RTC_VERTEX_BUFFER0 && type < RTCBufferType(RTC_VERTEX_BUFFER0 + numTimeSteps)) { size_t t = type - RTC_VERTEX_BUFFER0; vertices[t].set(ptr,offset,stride,size); vertices[t].checkPadding16(); } else if (type >= RTC_USER_VERTEX_BUFFER0 && type < RTC_USER_VERTEX_BUFFER0+RTC_MAX_USER_VERTEX_BUFFERS) { if (bid >= userbuffers.size()) userbuffers.resize(bid+1); userbuffers[bid] = APIBuffer<char>(scene->device,numVertices(),stride); userbuffers[bid].set(ptr,offset,stride,size); userbuffers[bid].checkPadding16(); } else if (type == RTC_INDEX_BUFFER) { if (isEnabled() && size != (size_t)-1) disabling(); curves.set(ptr,offset,stride,size); setNumPrimitives(size); if (isEnabled() && size != (size_t)-1) enabling(); } else throw_RTCError(RTC_INVALID_ARGUMENT,"unknown buffer type"); }
void QuadMesh::setBuffer(RTCBufferType type, void* ptr, size_t offset, size_t stride, size_t size) { if (scene->isStatic() && scene->isBuild()) throw_RTCError(RTC_INVALID_OPERATION,"static scenes cannot get modified"); /* verify that all accesses are 4 bytes aligned */ if (((size_t(ptr) + offset) & 0x3) || (stride & 0x3)) throw_RTCError(RTC_INVALID_OPERATION,"data must be 4 bytes aligned"); unsigned bid = type & 0xFFFF; if (type >= RTC_VERTEX_BUFFER0 && type < RTCBufferType(RTC_VERTEX_BUFFER0 + numTimeSteps)) { size_t t = type - RTC_VERTEX_BUFFER0; if (size == -1) size = vertices[t].size(); /* if buffer is larger than 16GB the premultiplied index optimization does not work */ if (stride*size > 16ll*1024ll*1024ll*1024ll) throw_RTCError(RTC_INVALID_OPERATION,"vertex buffer can be at most 16GB large"); vertices[t].set(ptr,offset,stride,size); vertices[t].checkPadding16(); vertices0 = vertices[0]; } else if (type >= RTC_USER_VERTEX_BUFFER0 && type < RTC_USER_VERTEX_BUFFER0+RTC_MAX_USER_VERTEX_BUFFERS) { if (bid >= userbuffers.size()) userbuffers.resize(bid+1); userbuffers[bid] = APIBuffer<char>(scene->device,numVertices(),stride); userbuffers[bid].set(ptr,offset,stride,size); userbuffers[bid].checkPadding16(); } else if (type == RTC_INDEX_BUFFER) { if (size != (size_t)-1) disabling(); quads.set(ptr,offset,stride,size); setNumPrimitives(size); if (size != (size_t)-1) enabling(); } else throw_RTCError(RTC_INVALID_ARGUMENT,"unknown buffer type"); }