コード例 #1
0
ファイル: volumeraycastercl.cpp プロジェクト: Ojaswi/inviwo
void VolumeRaycasterCL::setDefaultBackgroundColor(const vec4 color) {
    LayerRAM* defaultBGRAM =
        defaultBackground_.getEditableRepresentation<LayerRAM>();
    unsigned char* data = static_cast<unsigned char*>(defaultBGRAM->getData());
    for (int i = 0; i < 4; ++i) {
        data[i] = static_cast<unsigned char>(glm::floor(color[i] * 255.f + 0.5f));
    }
}
コード例 #2
0
ファイル: layerramconverter.cpp プロジェクト: sarbi127/inviwo
void LayerDisk2RAMConverter::update(const DataRepresentation* source,
                                    DataRepresentation* destination) {
    const LayerDisk* layerSrc = static_cast<const LayerDisk*>(source);
    LayerRAM* layerDst = static_cast<LayerRAM*>(destination);

    if (layerSrc->getDimensions() != layerDst->getDimensions())
        layerDst->setDimensions(layerSrc->getDimensions());

    layerSrc->readDataInto(layerDst->getData());
}
コード例 #3
0
ファイル: heightfieldmapper.cpp プロジェクト: Ojaswi/inviwo
void HeightFieldMapper::process() {
    if (!inport_.isReady()) return;

    auto srcImg = inport_.getData();
    if (!srcImg) {
        LogWarn("No valid input image given");
        return;
    }

    // check the number of channels
    const DataFormatBase *format = srcImg->getDataFormat();
    std::size_t numInputChannels = format->getComponents();
    size2_t dim = srcImg->getDimensions();

    Image *outImg = nullptr;

    // check format of output image
    if (!outImg || (outImg->getDataFormat()->getId() != DataFormatId::Float32)) {
        // replace with new floating point image
        Image *img = new Image(dim, DataFloat32::get());
        outport_.setData(img);
        outImg = img;
    } else if (outImg->getDimensions() != dim) {
        // adjust dimensions of output image
        outImg->setDimensions(dim);
    }

    LayerRAM *dstLayer = outImg->getColorLayer(0)->getEditableRepresentation<LayerRAM>();
    float *data = static_cast<float *>(dstLayer->getData());

    // convert input image to float image
    const LayerRAM *srcLayer = srcImg->getColorLayer(0)->getRepresentation<LayerRAM>();

    // special case: input image is already FLOAT32 with 1 channel
    if ((numInputChannels == 1) && (format->getId() == DataFormatId::Float32)) {
        const float *srcData = static_cast<const float *>(srcLayer->getData());
        std::copy(srcData, srcData + dim.x * dim.y, data);
    } else {
        switch (numInputChannels) {
            case 2:
                for (unsigned int y = 0; y < dim.y; ++y) {
                    for (unsigned int x = 0; x < dim.x; ++x) {
                        data[y * dim.x + x] =
                            static_cast<float>(srcLayer->getValueAsVec2Double(glm::uvec2(x, y)).r);
                    }
                }
                break;
            case 3:
                for (unsigned int y = 0; y < dim.y; ++y) {
                    for (unsigned int x = 0; x < dim.x; ++x) {
                        data[y * dim.x + x] =
                            static_cast<float>(srcLayer->getValueAsVec3Double(glm::uvec2(x, y)).r);
                    }
                }
                break;
            case 4:
                for (unsigned int y = 0; y < dim.y; ++y) {
                    for (unsigned int x = 0; x < dim.x; ++x) {
                        data[y * dim.x + x] =
                            static_cast<float>(srcLayer->getValueAsVec4Double(glm::uvec2(x, y)).r);
                    }
                }
                break;
            case 1:
            default:
                for (unsigned int y = 0; y < dim.y; ++y) {
                    for (unsigned int x = 0; x < dim.x; ++x) {
                        data[y * dim.x + x] =
                            static_cast<float>(srcLayer->getValueAsSingleDouble(glm::uvec2(x, y)));
                    }
                }
                break;
        }
    }

    // rescale data set
    std::size_t numValues = dim.x * dim.y;
    // determine min/max values
    float minVal = *std::min_element(data, data + numValues);
    float maxVal = *std::max_element(data, data + numValues);

    switch (scalingModeProp_.get()) {
        case HeightFieldScaling::SeaLevel: {
            // scale heightfield based on sea level and min/max height
            float sealevel = seaLevel_.get();
            float aboveSea = maxVal - sealevel;
            float belowSea = minVal - sealevel;

            float factor = maxHeight_.get() / std::max(aboveSea, std::abs(belowSea));
            for (std::size_t i = 0; i < numValues; ++i) {
                data[i] = (data[i] - sealevel) * factor;
            }
        } break;
        case HeightFieldScaling::DataRange: {
            // scale data to [heightRange_.min : heightRange_.max]
            glm::vec2 range(heightRange_.get());

            float factor = (range.y - range.x) / (maxVal - minVal);
            for (std::size_t i = 0; i < numValues; ++i) {
                data[i] = (data[i] - minVal) * factor + range.x;
            }
        } break;
        case HeightFieldScaling::FixedRange:
        default: {
            // scale data to [0:1] range
            float delta = 1.0f / (maxVal - minVal);
            for (std::size_t i = 0; i < numValues; ++i) {
                data[i] = (data[i] - minVal) * delta;
            }
        } break;
    }
}