/*
 * Copyright (c) 2026 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

struct [[ge::params(type=SPATIAL_GLASS_EFFECT, name="SpatialGlassEffect")]] GESpatialGlassEffectParams {
    [[ge::prop(min={-200.0f, -200.0f, -200.0f},
               max={200.0f, 200.0f, 200.0f})]]
    Vector3f leftTop = Vector3f(0.0f, 0.0f, 0.0f);
    [[ge::prop(min={-200.0f, -200.0f, -200.0f},
               max={200.0f, 200.0f, 200.0f})]]
    Vector3f leftBot = Vector3f(0.0f, 0.0f, 0.0f);
    [[ge::prop(min={-200.0f, -200.0f, -200.0f},
               max={200.0f, 200.0f, 200.0f})]]
    Vector3f rightTop = Vector3f(0.0f, 0.0f, 0.0f);
    [[ge::prop(min={-200.0f, -200.0f, -200.0f},
               max={200.0f, 200.0f, 200.0f})]]
    Vector3f rightBot = Vector3f(0.0f, 0.0f, 0.0f);
    [[ge::prop(min={-200.0f, -200.0f, -200.0f},
               max={200.0f, 200.0f, 200.0f})]]
    Vector3f cameraPosition = Vector3f(0.0f, 0.0f, 0.0f);
    [[ge::prop(min={-200.0f, -200.0f},
               max={200.0f, 200.0f})]]
    Vector2f cameraIntrinsics = Vector2f(0.0f, 0.0f);
    [[ge::prop(min={-200.0f, -200.0f, -200.0f},
               max={200.0f, 200.0f, 200.0f})]]
    Vector3f lightDir = Vector3f(0.0f, 0.0f, 0.0f);
    [[ge::prop(min={0.0f, 0.0f},
               max={100.0f, 100.0f},
               cast_from="std::pair<float,float>",
               custom="PairToVector2fTransformer")]]
    Vector2f thickParams = Vector2f(1.0f, 1.0f);
    [[ge::prop(min={0.0f, 0.0f, 0.0f, 0.0f}, max={1.0f, 1.0f, 1.0f, 1.0f})]]
    Vector4f glassBaseColor = Vector4f(1.0f, 1.0f, 1.0f, 1.0f);
    [[ge::prop(min={0.0f, 0.0f, 0.0f, 0.0f}, max={1.0f, 1.0f, 1.0f, 1.0f})]]
    Vector4f fresnelEnvColor = Vector4f(1.0f, 1.0f, 1.0f, 1.0f);
    [[ge::prop(min={-200.0f, -200.0f},
               max={200.0f, 200.0f},
               cast_from="std::pair<float,float>",
               custom="PairToVector2fTransformer")]]
    Vector2f fresnelEnvParams = Vector2f(1.0f, 1.0f);
    [[ge::prop(min={0.0f, 0.0f},
               max={200.0f, 200.0f},
               cast_from="std::pair<float,float>",
               custom="PairToVector2fTransformer")]]
    Vector2f bgRates = Vector2f(0.0f, 0.0f);
    [[ge::prop(min={-20.0f, -20.0f, 0.0f},
               max={20.0f, 20.0f, 20.0f})]]
    Vector3f bgKBS = Vector3f(0.010834f, 0.007349f, 1.2f);
    [[ge::prop(min={-20.0f, -20.0f, -20.0f},
               max={20.0f, 20.0f, 20.0f})]]
    Vector3f bgPos = Vector3f(0.3f, 0.5f, 1.0f);
    [[ge::prop(min={-20.0f, -20.0f, -20.0f},
               max={20.0f, 20.0f, 20.0f})]]
    Vector3f bgNeg = Vector3f(0.5f, 0.5f, 1.0f);
    [[ge::prop(min={-200.0f, -200.0f, -200.0f},
               max={200.0f, 200.0f, 200.0f})]]
    Vector3f refractParams = Vector3f(0.0f, 0.0f, 0.0f);
    [[ge::prop(min={0.0f, 0.0f},
               max={200.0f, 200.0f},
               cast_from="std::pair<float,float>",
               custom="PairToVector2fTransformer")]]
    Vector2f weightsEdl = Vector2f(1.0f, 1.0f);
    [[ge::prop(min={-200.0f, -200.0f, -200.0f},
               max={200.0f, 200.0f, 200.0f})]]
    Vector3f envLightParams = Vector3f(0.0f, 0.0f, 0.0f);
    [[ge::prop(min={0.0f, 0.0f},
               max={200.0f, 200.0f},
               cast_from="std::pair<float,float>",
               custom="PairToVector2fTransformer")]]
    Vector2f envLightRates = Vector2f(0.0f, 0.0f);
    [[ge::prop(min={-20.0f, -20.0f, 0.0f},
               max={20.0f, 20.0f, 20.0f})]]
    Vector3f envLightKBS = Vector3f(0.010834f, 0.007349f, 1.2f);
    [[ge::prop(min={-20.0f, -20.0f, -20.0f},
               max={20.0f, 20.0f, 20.0f})]]
    Vector3f envLightPos = Vector3f(0.3f, 0.5f, 1.0f);
    [[ge::prop(min={-20.0f, -20.0f, -20.0f},
               max={20.0f, 20.0f, 20.0f})]]
    Vector3f envLightNeg = Vector3f(0.5f, 0.5f, 1.0f);
    [[ge::prop(min={-200.0f, -200.0f, -200.0f},
               max={200.0f, 200.0f, 200.0f})]]
    Vector3f sdParams = Vector3f(0.0f, 0.0f, 0.0f);
    [[ge::prop(min={0.0f, 0.0f},
               max={200.0f, 200.0f},
               cast_from="std::pair<float,float>",
               custom="PairToVector2fTransformer")]]
    Vector2f sdRates = Vector2f(0.0f, 0.0f);
    [[ge::prop(min={-20.0f, -20.0f, 0.0f},
               max={20.0f, 20.0f, 20.0f})]]
    Vector3f sdKBS = Vector3f(0.010834f, 0.007349f, 1.2f);
    [[ge::prop(min={-20.0f, -20.0f, -20.0f},
               max={20.0f, 20.0f, 20.0f})]]
    Vector3f sdPos = Vector3f(0.3f, 0.5f, 1.0f);
    [[ge::prop(min={-20.0f, -20.0f, -20.0f},
               max={20.0f, 20.0f, 20.0f})]]
    Vector3f sdNeg = Vector3f(0.5f, 0.5f, 1.0f);
    [[ge::prop(cast_from="std::shared_ptr<GEShaderShape>")]]
    std::shared_ptr<Drawing::GESDFShaderShape> sdfShape;
    // Adapt effect component
    [[ge::prop(cast_from="std::shared_ptr<Drawing::Image>", custom="SharedPtrImageToWeakTransformer")]]
    std::weak_ptr<Drawing::Image> blurImage; // frosted glass blur by ec
    [[ge::prop(cast_from="std::shared_ptr<Drawing::Image>", custom="SharedPtrImageToWeakTransformer")]]
    std::weak_ptr<Drawing::Image> depthImage; // depthImage
    RectF snapshotRect; // effect component snapshot total rect
    Drawing::Matrix snapshotMatrix; // effect component total matrix
    [[ge::prop(min=-500.0f, max=500.0f)]]
    float refractOutPx = 0.0f; // envlight refraction outward sampling degree
    bool enableSDFCache = true;
};