163 lines
No EOL
5.5 KiB
C++
163 lines
No EOL
5.5 KiB
C++
#pragma once
|
|
|
|
#ifndef IWA_FLOORBUMPFX_H
|
|
#define IWA_FLOORBUMPFX_H
|
|
|
|
#include "tfxparam.h"
|
|
#include "stdfx.h"
|
|
#include "tparamset.h"
|
|
|
|
#include <QVector3D>
|
|
struct float4 {
|
|
float x, y, z, w;
|
|
float4 operator*(const float &v) const {
|
|
return float4{x * v, y * v, z * v, w * v};
|
|
}
|
|
float4 &operator+=(const float4 &v) {
|
|
x += v.x;
|
|
y += v.y;
|
|
z += v.z;
|
|
w += v.w;
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
class Iwa_FloorBumpFx final : public TStandardRasterFx {
|
|
FX_PLUGIN_DECLARATION(Iwa_FloorBumpFx)
|
|
public:
|
|
enum RenderMode {
|
|
TextureMode = 0,
|
|
DiffuseMode,
|
|
SpecularMode,
|
|
FresnelMode,
|
|
RefractionMode,
|
|
ReflectionMode
|
|
};
|
|
|
|
struct FloorBumpVars {
|
|
double waveHeight;
|
|
double displacement;
|
|
int refHeight;
|
|
TDimensionI outDim;
|
|
TDimensionI resultDim;
|
|
int margin;
|
|
double precision;
|
|
// add margins to all ends and multiply by precision value
|
|
TDimensionI sourceDim; // u
|
|
// only add margins for height image
|
|
TDimensionI refDim; // u
|
|
|
|
// collecting parameters
|
|
double textureOffsetAmount; // u
|
|
double spread; // u
|
|
double camAltitude;
|
|
int renderMode; // u
|
|
bool differenceMode; // u
|
|
|
|
// making pixels in gray128 to be zero level height
|
|
// ( 128/255. IT'S NOT 0.5! )
|
|
double zeroLevel; // u
|
|
double H; // u
|
|
double W; // u
|
|
// angle between the optical axis and the horizontal axis
|
|
double angle_el; // u
|
|
// Y coordinate of the Eye position (P)
|
|
double P_y; // u
|
|
// distance from the Eye (P) to the center of the projection plane (T)
|
|
double d_PT; // u
|
|
|
|
// Z-Y position of the center of top edge of the projection plane (A)
|
|
QPointF A; // u
|
|
// Z-Y position of the center of bottom edge of the projection plane (B)
|
|
QPointF B; // u
|
|
|
|
// (C) is an intersection between the XZ plane and the line P->B
|
|
double C_z; // u
|
|
QVector3D sunVec; // u
|
|
double base_fresnel_ref; // u
|
|
double depth, r_index; // uu
|
|
double distance; // u
|
|
QVector3D eyePos; // u
|
|
};
|
|
|
|
protected:
|
|
TRasterFxPort m_heightRef; // height reference image
|
|
TRasterFxPort m_texture; // texture image
|
|
TRasterFxPort m_dispRef; // displacement image
|
|
|
|
TIntEnumParamP m_renderMode;
|
|
|
|
TDoubleParamP m_fov; // camera fov (degrees)
|
|
TDoubleParamP
|
|
m_cameraAltitude; // height of the bottom edge of projection plane
|
|
|
|
TDoubleParamP m_eyeLevel; // height of the vanishing point
|
|
TDoubleParamP m_drawLevel; // upper rendering boundary
|
|
|
|
TDoubleParamP m_waveHeight; // height of waves to the both sides (i.e.
|
|
// amplitude becomes 2*waveHeight)
|
|
|
|
TBoolParamP
|
|
m_differenceMode; // available in diffuse and fresnel mode,
|
|
// render brightness difference from unbumped state
|
|
|
|
// Texture mode parameters
|
|
TDoubleParamP m_textureOffsetAmount; // amount of texture trailing along with
|
|
// gradient of the bump
|
|
TDoubleParamP
|
|
m_textureOffsetSpread; // adding "blur" to the gradient distribution
|
|
|
|
TDoubleParamP m_sourcePrecision; // to load the texture with higher dpi
|
|
TDoubleParamP m_souceMargin; // margins to be added to all edges for both the
|
|
// height reference and the texture images
|
|
|
|
TDoubleParamP m_displacement;
|
|
|
|
// Shading (Diffuse and Specular) modes parameters
|
|
TDoubleParamP m_lightAzimuth; // light is in front of camera with azimuth=0.
|
|
// clockwise angle (degrees)
|
|
TDoubleParamP m_lightElevation; // (degrees)
|
|
|
|
// Refraction mode parameters
|
|
TDoubleParamP m_depth; // water depth. the bottom will be placed at -depth
|
|
TDoubleParamP
|
|
m_refractiveIndex; // refractive index of the medium under the surface
|
|
|
|
// Reflection mode parameter
|
|
TDoubleParamP m_distanceLevel; // the distance of the reflected object
|
|
// specified by the postion on the surface
|
|
|
|
// convert output values (in float4) to channel value
|
|
template <typename RASTER, typename PIXEL>
|
|
void setOutputRaster(float4 *srcMem, const RASTER dstRas, TDimensionI dim,
|
|
int drawLevel);
|
|
|
|
// convert input tile's channel values to float4 values
|
|
template <typename RASTER, typename PIXEL>
|
|
void setSourceRaster(const RASTER srcRas, float4 *srcMem, TDimensionI dim);
|
|
|
|
void setRefRaster(const TRaster64P refRas, float *refMem, TDimensionI dim,
|
|
bool isRef);
|
|
|
|
inline void initVars(FloorBumpVars &vars, TTile &tile,
|
|
const TRenderSettings &settings, double frame);
|
|
|
|
public:
|
|
Iwa_FloorBumpFx();
|
|
bool doGetBBox(double frame, TRectD &bBox,
|
|
const TRenderSettings &info) override;
|
|
bool canHandle(const TRenderSettings &info, double frame) override;
|
|
void doCompute(TTile &tile, double frame,
|
|
const TRenderSettings &rend_sets) override;
|
|
void doCompute_CPU(TTile &tile, const double frame,
|
|
const TRenderSettings &settings, const FloorBumpVars &vars,
|
|
float4 *source_host, float *ref_host, float4 *result_host);
|
|
void doCompute_with_Displacement(TTile &tile, const double frame,
|
|
const TRenderSettings &settings,
|
|
const FloorBumpVars &vars,
|
|
float4 *source_host, float *ref_host,
|
|
float *disp_host, float4 *result_host);
|
|
void getParamUIs(TParamUIConcept *&concepts, int &length) override;
|
|
};
|
|
|
|
#endif |