bool image_map(const Vector3d& EPoint, const PIGMENT *Pigment, TransColour& colour) { // TODO ALPHA - the caller does expect non-premultiplied data, but maybe he could profit from premultiplied data? int reg_number; DBL xcoor = 0.0, ycoor = 0.0; // If outside map coverage area, return clear if(map_pos(EPoint, Pigment->pattern.get(), &xcoor, &ycoor)) { colour = ToTransColour(RGBFTColour(1.0, 1.0, 1.0, 0.0, 1.0)); return false; } else { RGBFTColour rgbft; if (const ImagePatternImpl *pattern = dynamic_cast<ImagePatternImpl*>(Pigment->pattern.get())) image_colour_at(pattern->pImage, xcoor, ycoor, rgbft, ®_number, false); else POV_PATTERN_ASSERT(false); colour = ToTransColour(rgbft); return true; } }
SceneData::SceneData() : fog(nullptr), rainbow(nullptr), skysphere(nullptr), functionContextFactory() { atmosphereIOR = 1.0; atmosphereDispersion = 0.0; backgroundColour = ToTransColour(RGBFTColour(0.0, 0.0, 0.0, 0.0, 1.0)); ambientLight = MathColour(1.0); iridWavelengths = MathColour::DefaultWavelengths(); languageVersion = POV_RAY_VERSION_INT; languageVersionSet = false; languageVersionLate = false; warningLevel = 10; // all warnings legacyCharset = LegacyCharset::kUnspecified; noiseGenerator = kNoiseGen_RangeCorrected; explicitNoiseGenerator = false; // scene has not set the noise generator explicitly boundingMethod = 0; numberOfWaves = 10; parsedMaxTraceLevel = MAX_TRACE_LEVEL_DEFAULT; parsedAdcBailout = 1.0 / 255.0; // adc bailout sufficient for displays workingGamma.reset(); workingGammaToSRGB.reset(); inputFileGamma = SRGBGammaCurve::Get(); gammaMode = kPOVList_GammaMode_None; // default setting for v3.6.2, which in turn is the default for the language mmPerUnit = 10; useSubsurface = false; subsurfaceSamplesDiffuse = 50; subsurfaceSamplesSingle = 50; subsurfaceUseRadiosity = false; bspMaxDepth = 0; bspObjectIsectCost = bspBaseAccessCost = bspChildAccessCost = bspMissChance = 0.0f; Fractal_Iteration_Stack_Length = 0; Max_Blob_Components = 1000; // TODO FIXME - this gets set in the parser but allocated *before* that in the scene data, and if it is 0 here, a malloc may fail there because the memory requested is zero [trf] Max_Bounding_Cylinders = 100; // TODO FIXME - see note for Max_Blob_Components boundingSlabs = nullptr; splitUnions = false; removeBounds = true; tree = nullptr; }
SceneData::SceneData() : fog(NULL), rainbow(NULL), skysphere(NULL), functionContextFactory(new FunctionVM()) { atmosphereIOR = 1.0; atmosphereDispersion = 0.0; backgroundColour = ToTransColour(RGBFTColour(0.0, 0.0, 0.0, 0.0, 1.0)); ambientLight = MathColour(1.0); iridWavelengths = MathColour::DefaultWavelengths(); languageVersion = OFFICIAL_VERSION_NUMBER; languageVersionSet = false; languageVersionLate = false; warningLevel = 10; // all warnings stringEncoding = kStringEncoding_ASCII; noiseGenerator = kNoiseGen_RangeCorrected; explicitNoiseGenerator = false; // scene has not set the noise generator explicitly numberOfWaves = 10; parsedMaxTraceLevel = MAX_TRACE_LEVEL_DEFAULT; parsedAdcBailout = 1.0 / 255.0; // adc bailout sufficient for displays workingGamma.reset(); workingGammaToSRGB.reset(); inputFileGammaSet = false; // TODO remove for 3.7x inputFileGamma = SRGBGammaCurve::Get(); mmPerUnit = 10; useSubsurface = false; subsurfaceSamplesDiffuse = 50; subsurfaceSamplesSingle = 50; subsurfaceUseRadiosity = false; bspMaxDepth = 0; bspObjectIsectCost = bspBaseAccessCost = bspChildAccessCost = bspMissChance = 0.0f; Fractal_Iteration_Stack_Length = 0; Max_Blob_Components = 1000; // TODO FIXME - this gets set in the parser but allocated *before* that in the scene data, and if it is 0 here, a malloc may fail there because the memory requested is zero [trf] Max_Bounding_Cylinders = 100; // TODO FIXME - see note for Max_Blob_Components boundingSlabs = NULL; splitUnions = false; removeBounds = true; tree = NULL; }
static void InterpolateBicubic(const ImageData *image, DBL xcoor, DBL ycoor, RGBFTColour& colour, int *index, bool premul) { int iycoor, ixcoor; int cornerIndex; RGBFTColour cornerColour; DBL factor; DBL factorsX[4]; DBL factorsY[4]; xcoor += 0.5; ycoor += 0.5; iycoor = (int)ycoor; ixcoor = (int)xcoor; cubic(factorsX, xcoor); cubic(factorsY, ycoor); // We're using double precision for the colors here to avoid higher-than-1.0 results due to rounding errors, // which would otherwise lead to stray dot artifacts when clamped to [0..1] range for a color_map or similar. // (Note that strictly speaking we don't avoid such rounding errors, but rather make them small enough that // subsequent rounding to single precision will take care of them.) // (Note that bicubic interpolation may still give values outside the range [0..1] at high-contrast edges; // this is an inherent property of this interpolation method, and is therefore accepted here.) PreciseRGBFTColour tempColour; DBL tempIndex = 0; for (int i = 0; i < 4; i ++) { for (int j = 0; j < 4; j ++) { cornerColour.Clear(); no_interpolation(image, (DBL)ixcoor + i-2, (DBL)iycoor + j-2, cornerColour, &cornerIndex, premul); factor = factorsX[i] * factorsY[j]; tempColour += PreciseRGBFTColour(cornerColour) * factor; tempIndex += cornerIndex * factor; } } colour = RGBFTColour(tempColour); *index = (int)tempIndex; }
static void Interp(const ImageData *image, DBL xcoor, DBL ycoor, RGBFTColour& colour, int *index, bool premul) { int iycoor, ixcoor, i; int Corners_Index[4]; RGBFTColour Corner_Colour[4]; DBL Corner_Factors[4]; xcoor += 0.5; ycoor += 0.5; iycoor = (int)ycoor; ixcoor = (int)xcoor; no_interpolation(image, (DBL)ixcoor, (DBL)iycoor, Corner_Colour[0], &Corners_Index[0], premul); no_interpolation(image, (DBL)ixcoor - 1, (DBL)iycoor, Corner_Colour[1], &Corners_Index[1], premul); no_interpolation(image, (DBL)ixcoor, (DBL)iycoor - 1, Corner_Colour[2], &Corners_Index[2], premul); no_interpolation(image, (DBL)ixcoor - 1, (DBL)iycoor - 1, Corner_Colour[3], &Corners_Index[3], premul); if(image->Interpolation_Type == BILINEAR) bilinear(Corner_Factors, xcoor, ycoor); else if(image->Interpolation_Type == NORMALIZED_DIST) norm_dist(Corner_Factors, xcoor, ycoor); else POV_ASSERT(false); // We're using double precision for the colors here to avoid higher-than-1.0 results due to rounding errors, // which would otherwise lead to stray dot artifacts when clamped to [0..1] range for a color_map or similar. // (Note that strictly speaking we don't avoid such rounding errors, but rather make them small enough that // subsequent rounding to single precision will take care of them.) PreciseRGBFTColour temp_colour; DBL temp_index = 0; for (i = 0; i < 4; i ++) { temp_colour += PreciseRGBFTColour(Corner_Colour[i]) * Corner_Factors[i]; temp_index += Corners_Index[i] * Corner_Factors[i]; } colour = RGBFTColour(temp_colour); *index = (int)temp_index; }