| 19 | } |
| 20 | |
| 21 | void GeometricModel::commit() |
| 22 | { |
| 23 | geom = getParamObject<Geometry>("geometry", geomAPI.ptr); |
| 24 | if (!geom) |
| 25 | throw std::runtime_error(toString() + " received NULL 'geometry'"); |
| 26 | |
| 27 | materialData = getParamDataT<Material *>("material", false, true); |
| 28 | |
| 29 | materialArray = nullptr; |
| 30 | materialIDArray = nullptr; |
| 31 | getSh()->material = nullptr; |
| 32 | getSh()->materialID = nullptr; |
| 33 | getSh()->numMaterials = 0; |
| 34 | featureFlagsOther = FFO_NONE; |
| 35 | if (materialData) { |
| 36 | for (auto &&mat : materialData->as<Material *>()) |
| 37 | featureFlagsOther |= mat->getFeatureFlags().other; |
| 38 | |
| 39 | materialArray = devicert::make_buffer_shared_unique<ispc::Material *>( |
| 40 | getISPCDevice().getDRTDevice(), |
| 41 | createArrayOfSh<ispc::Material>(materialData->as<Material *>())); |
| 42 | getSh()->material = materialArray->sharedPtr(); |
| 43 | getSh()->numMaterials = materialArray->size(); |
| 44 | } else { |
| 45 | materialData = getParamDataT<uint32_t>("material", false, true); |
| 46 | if (materialData) { |
| 47 | materialIDArray = devicert::make_buffer_shared_unique<uint32_t>( |
| 48 | getISPCDevice().getDRTDevice(), |
| 49 | materialData->as<uint32_t>().data(), |
| 50 | materialData->size()); |
| 51 | getSh()->materialID = materialIDArray->sharedPtr(); |
| 52 | getSh()->numMaterials = materialIDArray->size(); |
| 53 | } |
| 54 | } |
| 55 | colorData = getParamDataT<vec4f>("color", false, true); |
| 56 | indexData = getParamDataT<uint8_t>("index"); |
| 57 | |
| 58 | size_t maxItems = geom->numPrimitives(); |
| 59 | if (indexData && indexData->size() < maxItems) { |
| 60 | postStatusMsg(OSP_LOG_INFO) |
| 61 | << toString() |
| 62 | << " not enough 'index' elements for 'geometry', clamping"; |
| 63 | } |
| 64 | |
| 65 | if (indexData) |
| 66 | maxItems = 256; // conservative, should actually go over the index |
| 67 | |
| 68 | if (materialData && materialData->size() > 1 |
| 69 | && materialData->size() < maxItems) { |
| 70 | postStatusMsg(OSP_LOG_INFO) |
| 71 | << toString() |
| 72 | << " potentially not enough 'material' elements for " |
| 73 | "'geometry', clamping"; |
| 74 | } |
| 75 | |
| 76 | if (colorData && colorData->size() > 1 && colorData->size() < maxItems) { |
| 77 | postStatusMsg(OSP_LOG_INFO) |
| 78 | << toString() |
nothing calls this directly
no test coverage detected