| 99 | // ------------------------------------------------------------------------------------------------------------- |
| 100 | |
| 101 | unique_ptr<AbstractRD> CreateFromImageDataFile( |
| 102 | const char *filename, |
| 103 | bool is_opencl_available, |
| 104 | int opencl_platform, |
| 105 | int opencl_device, |
| 106 | Properties &render_settings, |
| 107 | bool &warn_to_update) |
| 108 | { |
| 109 | vtkSmartPointer<RD_XMLImageReader> reader = vtkSmartPointer<RD_XMLImageReader>::New(); |
| 110 | reader->SetFileName(filename); |
| 111 | reader->Update(); |
| 112 | vtkImageData *image = reader->GetOutput(); |
| 113 | |
| 114 | if( image == NULL ) |
| 115 | throw runtime_error("Failed to read image."); |
| 116 | if (image->GetPointData() == NULL) |
| 117 | throw runtime_error("Image has no point data."); |
| 118 | if (image->GetPointData()->GetArray(0) == NULL) |
| 119 | throw runtime_error("No arrays in image point data."); |
| 120 | |
| 121 | int data_type = image->GetPointData()->GetArray(0)->GetDataType(); |
| 122 | string type = reader->GetType(); |
| 123 | string name = reader->GetName(); |
| 124 | |
| 125 | unique_ptr<ImageRD> image_system; |
| 126 | if(type=="inbuilt") |
| 127 | { |
| 128 | if(name=="Gray-Scott") |
| 129 | image_system = make_unique<GrayScottImageRD>(); |
| 130 | else |
| 131 | throw runtime_error("Unsupported inbuilt implementation: "+name); |
| 132 | } |
| 133 | else if(type=="formula") |
| 134 | { |
| 135 | if(!is_opencl_available) |
| 136 | throw runtime_error(OpenCL_utils::GetOpenCLInstallationHints()); |
| 137 | image_system = make_unique<FormulaOpenCLImageRD>(opencl_platform,opencl_device,data_type); |
| 138 | } |
| 139 | else if(type=="kernel") |
| 140 | { |
| 141 | if(!is_opencl_available) |
| 142 | throw runtime_error(OpenCL_utils::GetOpenCLInstallationHints()); |
| 143 | image_system = make_unique<FullKernelOpenCLImageRD>(opencl_platform,opencl_device,data_type); |
| 144 | } |
| 145 | else throw runtime_error("Unsupported rule type: "+type); |
| 146 | image_system->InitializeFromXML(reader->GetRDElement(),warn_to_update); |
| 147 | |
| 148 | // render settings |
| 149 | vtkSmartPointer<vtkXMLDataElement> xml_render_settings = |
| 150 | reader->GetRDElement()->FindNestedElementWithName("render_settings"); |
| 151 | if(xml_render_settings) // optional |
| 152 | render_settings.OverwriteFromXML(xml_render_settings); |
| 153 | |
| 154 | int dim[3]; |
| 155 | image->GetDimensions(dim); |
| 156 | int nc = image->GetNumberOfScalarComponents() * image->GetPointData()->GetNumberOfArrays(); |
| 157 | image_system->SetDimensions(dim[0],dim[1],dim[2]); |
| 158 | image_system->SetNumberOfChemicals(nc); |
no test coverage detected