| 36 | } |
| 37 | |
| 38 | void Points::setBuffer(RTCBufferType type, |
| 39 | unsigned int slot, |
| 40 | RTCFormat format, |
| 41 | const Ref<Buffer>& buffer, |
| 42 | size_t offset, |
| 43 | size_t stride, |
| 44 | unsigned int num) |
| 45 | { |
| 46 | /* verify that all accesses are 4 bytes aligned */ |
| 47 | if ((type != RTC_BUFFER_TYPE_FLAGS) && (((size_t(buffer->getHostPtr()) + offset) & 0x3) || (stride & 0x3))) |
| 48 | throw_RTCError(RTC_ERROR_INVALID_OPERATION, "data must be 4 bytes aligned"); |
| 49 | |
| 50 | if (type == RTC_BUFFER_TYPE_VERTEX) { |
| 51 | if (format != RTC_FORMAT_FLOAT4) |
| 52 | throw_RTCError(RTC_ERROR_INVALID_OPERATION, "invalid vertex buffer format"); |
| 53 | |
| 54 | if (slot >= vertices.size()) |
| 55 | throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "invalid vertex buffer slot"); |
| 56 | |
| 57 | vertices[slot].set(buffer, offset, stride, num, format); |
| 58 | vertices[slot].checkPadding16(); |
| 59 | setNumPrimitives(num); |
| 60 | } else if (type == RTC_BUFFER_TYPE_NORMAL) { |
| 61 | if (getType() != GTY_ORIENTED_DISC_POINT) |
| 62 | throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "unknown buffer type"); |
| 63 | |
| 64 | if (format != RTC_FORMAT_FLOAT3) |
| 65 | throw_RTCError(RTC_ERROR_INVALID_OPERATION, "invalid normal buffer format"); |
| 66 | |
| 67 | if (slot >= normals.size()) |
| 68 | throw_RTCError(RTC_ERROR_INVALID_OPERATION, "invalid normal buffer slot"); |
| 69 | |
| 70 | normals[slot].set(buffer, offset, stride, num, format); |
| 71 | normals[slot].checkPadding16(); |
| 72 | } else if (type == RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE) { |
| 73 | if (format < RTC_FORMAT_FLOAT || format > RTC_FORMAT_FLOAT16) |
| 74 | throw_RTCError(RTC_ERROR_INVALID_OPERATION, "invalid vertex attribute buffer format"); |
| 75 | |
| 76 | if (slot >= vertexAttribs.size()) |
| 77 | throw_RTCError(RTC_ERROR_INVALID_OPERATION, "invalid vertex attribute buffer slot"); |
| 78 | |
| 79 | vertexAttribs[slot].set(buffer, offset, stride, num, format); |
| 80 | vertexAttribs[slot].checkPadding16(); |
| 81 | } else |
| 82 | throw_RTCError(RTC_ERROR_INVALID_ARGUMENT, "unknown buffer type"); |
| 83 | } |
| 84 | |
| 85 | void* Points::getBufferData(RTCBufferType type, unsigned int slot, BufferDataPointerType pointerType) |
| 86 | { |
no test coverage detected