import QtQuick 2.14
import QtQuick.Controls 2.14
import QtQuick.Layouts 1.14
import QtQuick.Scene3D 2.14
import Qt3D.Core 2.14
import Qt3D.Render 2.14
import Qt3D.Input 2.14
import Qt3D.Extras 2.14

import QtQuick 2.14 as QQ2

Entity {
    Material {
        id: polarPointsMaterial
        effect: Effect {
            id: polarPointsEffect
            parameters: [
                Parameter { name: "distance";       value: 0.0 },
                Parameter { name: "pitch";          value: 0.0 },
                Parameter { name: "yaw";            value: 0.0 },
                Parameter { name: "reflectivity";   value: 0.0 },
                Parameter { name: "dis_unit";       value: modelData.disUnit },
                Parameter { name: "bound_g";        value: 0.1 },
                Parameter { name: "bound_b";        value: 0.3 },
                Parameter { name: "bound_r";        value: 0.6 }
            ]
            techniques: [
                Technique {
                    graphicsApiFilter {
                        api: GraphicsApiFilter.OpenGL
                        profile: GraphicsApiFilter.CoreProfile
                        majorVersion: 3
                        minorVersion: 0
                    }

                    filterKeys: [ FilterKey { name: "renderingStyle"; value: "forward" } ]

                    renderPasses: [
                        RenderPass {
                            shaderProgram: ShaderProgram {
                                id: polarPointsShader
                                vertexShaderCode:   loadSource("file:glsl/polar_points.vert")
                                fragmentShaderCode: loadSource("file:glsl/pointxyzi.frag")
                            }
                            renderStates: [
                                DepthTest { depthFunction: DepthTest.Always },
                                BlendEquationArguments {
                                    sourceRgb: BlendEquationArguments.One
                                    destinationRgb: BlendEquationArguments.OneMinusSourceColor
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    }
    GeometryRenderer {
        id: polarPointsGeometry
        primitiveType: GeometryRenderer.Points
        geometry: Geometry {
            boundingVolumePositionAttribute: gl_Position
            Attribute {
                id: distance
                attributeType: Attribute.VertexAttribute
                vertexBaseType: Attribute.UnsignedShort
                vertexSize: 1
                count: modelData.vertexCount
                byteOffset: 0
                byteStride: 4 * 2
                name: "distance"
                buffer: vertexBuffer
            }
            Attribute {
                id: pitch
                attributeType: Attribute.VertexAttribute
                vertexBaseType: Attribute.UnsignedShort
                vertexSize: 1
                count: modelData.vertexCount
                byteOffset: 1 * 2
                byteStride: 4 * 2
                name: "pitch"
                buffer: vertexBuffer
            }
            Attribute {
                id: yaw
                attributeType: Attribute.VertexAttribute
                vertexBaseType: Attribute.UnsignedShort
                vertexSize: 1
                count: modelData.vertexCount
                byteOffset: 2 * 2
                byteStride: 4 * 2
                name: "yaw"
                buffer: vertexBuffer
            }
            Attribute {
                id: reflectivity
                attributeType: Attribute.VertexAttribute
                vertexBaseType: Attribute.UnsignedByte
                vertexSize: 1
                count: modelData.vertexCount
                byteOffset: 3 * 2
                byteStride: 4 * 2
                name: "reflectivity"
                buffer: vertexBuffer
            }
        }
        Buffer {
            id: vertexBuffer
            data: {
                // Dirty code: explicitly call garbage collection function
                gc()
                return modelData.vertex
            }
        }
    }
    ObjectPicker {
        id: polarPointsPicker
        property bool picking: true
        onPressed: picking = true
    }
    components: [polarPointsMaterial, polarPointsGeometry, polarPointsPicker]

    ColumnLayout {
        id: polarPointsHUD
        property alias picker: polarPointsPicker
        parent: picker.picking ? hud : invisibleHUD
        Button {
            text: "PolarPoints"
            onClicked: parent.picker.picking = false
        }
    }
}