import QtQuick 2.14
import QtQuick.Controls 2.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 {
    enabled: visible
    property bool visible: false
    NodeInstantiator {
        model: 1
        delegate: Entity {
            id: axisText
            property int pointSize: 2
            Entity {
                components: [ Transform{
                    translation: Qt.vector3d( 0, scene3d.height/40, 0)
                    // rotation: 
                    // fromEulerAngles(
                    //     // camera.upVector.z>0?Math.acos(camera.upVector.y/Math.sqrt(camera.upVector.z*camera.upVector.z+camera.upVector.y*camera.upVector.y))*180/Math.PI-180:-Math.acos(camera.upVector.y/Math.sqrt(camera.upVector.z*camera.upVector.z+camera.upVector.y*camera.upVector.y))*180/Math.PI+180,
                    //     //                    camera.upVector.x>0?Math.acos(camera.upVector.z/Math.sqrt(camera.upVector.z*camera.upVector.z+camera.upVector.x*camera.upVector.x))*180/Math.PI:360-Math.acos(camera.upVector.z/Math.sqrt(camera.upVector.z*camera.upVector.z+camera.upVector.x*camera.upVector.x))*180/Math.PI,
                    //     //                     camera.upVector.y>0?Math.acos(camera.upVector.x/Math.sqrt(camera.upVector.y*camera.upVector.y+camera.upVector.x*camera.upVector.x))*180/Math.PI+90:-Math.acos(camera.upVector.x/Math.sqrt(camera.upVector.y*camera.upVector.y+camera.upVector.x*camera.upVector.x))*180/Math.PI+270 
                    //                         )
                    rotationY: camera.position.z<0?180:0
                   
        
                }]
                Text2DEntity {
                    color: Qt.rgba(0.7,0.7,0.7,0.7)                    
                    font.bold: true
                    font.pointSize: axisText.pointSize
                    text: "y"
                    width: text.length * font.pointSize
                    height: font.pointSize*2
                }
               

            }
            Entity {
                components: [ Transform{
                    translation: Qt.vector3d(scene3d.height/40, 0, 0)
                    rotationZ: 0
                    rotationY: camera.position.z<0?180:0
                }]
                Text2DEntity {
                    color: Qt.rgba(0.7,0.7,0.7,0.7)
                    
                    font.bold: true
                    font.pointSize: axisText.pointSize
                    text: "x"
                    width: text.length * font.pointSize
                    height: font.pointSize*2
                }
            }
            Entity {
                components: [ Transform{
                    translation: Qt.vector3d(0, 0, scene3d.height/40)
                    rotationZ: 0
                    rotationY: camera.position.z<0?180:0
                }]
                Text2DEntity {
                    color:Qt.rgba(0.7,0.7,0.7,0.7)
                    
                    font.bold: true
                    font.pointSize: axisText.pointSize
                    text: "z"
                    width: text.length * font.pointSize
                    height: font.pointSize*2
                }
            }
            
        }
    }  
    
    Entity{
        LineMaterial {
            id: line_material1
            transparency: 1
            lineWidth: 2
            colorBound:Qt.vector3d(1,0,0)
        }
        PhongAlphaMaterial  {
            id: phong_alpha_material1
            alpha: 1
            ambient: 'red'
        }
        GeometryRenderer {
            id: cartesion_geometry1
            primitiveType: GeometryRenderer.LineLoop
            geometry: Geometry {
                boundingVolumePositionAttribute: position
                attributes: [
                    Attribute {
                        id: position
                        attributeType: Attribute.VertexAttribute
                        vertexBaseType: Attribute.Float
                        vertexSize: 3
                        count: 30
                        byteOffset: 0
                        byteStride: 3 * 4 // 1 vertex (=3 coordinates) * sizeof(float)
                        name: defaultPositionAttributeName
                        buffer: vertexBuffer1
                    }
                ]
            }
            Buffer {
                id: vertexBuffer1
                type: Buffer.VertexBuffer
                data: {
                    let vertexes = new Float32Array(54)
                    let index = 0
                    vertexes[index++] = vertexes[index++] = vertexes[index++] = 0
                    vertexes[index++] = scene3d.height/40
                    vertexes[index++] = 0
                    vertexes[index++] = 0
                    vertexes[index++] = scene3d.height/42.5
                    vertexes[index++] = scene3d.height/680
                    vertexes[index++] = 0
                    vertexes[index++] = scene3d.height/40
                    vertexes[index++] = 0
                    vertexes[index++] = 0
                    vertexes[index++] = scene3d.height/42.5
                    vertexes[index++] = -scene3d.height/680
                    vertexes[index++] = 0
                    vertexes[index++] = scene3d.height/40
                    vertexes[index++] = 0
                    vertexes[index++] = 0
                    
                    return vertexes
                }
            }
        }
        components: [config.IsWinGpuAmdCard()?line_material1:phong_alpha_material1, cartesion_geometry1]
    }
    
    Entity{
        GeometryRenderer {
            id: cartesion_geometry2
            primitiveType: GeometryRenderer.LineLoop
            geometry: Geometry {
                boundingVolumePositionAttribute: position2
                attributes: [
                    Attribute {
                        id: position2
                        attributeType: Attribute.VertexAttribute
                        vertexBaseType: Attribute.Float
                        vertexSize: 3
                        count: 30
                        byteOffset: 0
                        byteStride: 3 * 4 // 1 vertex (=3 coordinates) * sizeof(float)
                        name: defaultPositionAttributeName
                        buffer: vertexBuffer2
                    }
                ]
            }
            Buffer {
                id: vertexBuffer2
                type: Buffer.VertexBuffer
                data: {
                    let vertexes = new Float32Array(54)
                    let index = 0
                    vertexes[index++] = vertexes[index++] = vertexes[index++] = 0
                    vertexes[index++] = 0
                    vertexes[index++] = scene3d.height/40
                    vertexes[index++] = 0
                    vertexes[index++] = scene3d.height/680
                    vertexes[index++] = scene3d.height/42.5
                    vertexes[index++] = 0
                    vertexes[index++] = 0
                    vertexes[index++] = scene3d.height/40
                    vertexes[index++] = 0
                    vertexes[index++] = -scene3d.height/680
                    vertexes[index++] = scene3d.height/42.5
                    vertexes[index++] = 0
                    vertexes[index++] = 0
                    vertexes[index++] = scene3d.height/40
                    vertexes[index++] = 0
                
                    return vertexes
                }
            }
        }
        LineMaterial {
        id: line_material2
        transparency: 1
        lineWidth: 2
        colorBound:Qt.vector3d(1,1,0)
        }
        PhongAlphaMaterial  {
            id: phong_alpha_material2
            alpha: 1
            ambient: 'yellow'
        }
        components: [config.IsWinGpuAmdCard()?line_material2:phong_alpha_material2, cartesion_geometry2]
    }
    Entity{
        GeometryRenderer {
            id: cartesion_geometry3
            primitiveType: GeometryRenderer.LineLoop
            geometry: Geometry {
                boundingVolumePositionAttribute: position3
                attributes: [
                    Attribute {
                        id: position3
                        attributeType: Attribute.VertexAttribute
                        vertexBaseType: Attribute.Float
                        vertexSize: 3
                        count: 30
                        byteOffset: 0
                        byteStride: 3 * 4 // 1 vertex (=3 coordinates) * sizeof(float)
                        name: defaultPositionAttributeName
                        buffer: vertexBuffer3
                    }
                ]
            }
            Buffer {
                id: vertexBuffer3
                type: Buffer.VertexBuffer
                data: {
                    let vertexes = new Float32Array(54)
                    let index = 0
                    vertexes[index++] = vertexes[index++] = vertexes[index++] = 0
                    vertexes[index++] = 0
                    vertexes[index++] = 0
                    vertexes[index++] = scene3d.height/40
                    vertexes[index++] = 0
                    vertexes[index++] = scene3d.height/680
                    vertexes[index++] = scene3d.height/42.5
                    vertexes[index++] = 0
                    vertexes[index++] = 0
                    vertexes[index++] = scene3d.height/40
                    vertexes[index++] = 0
                    vertexes[index++] = -scene3d.height/680
                    vertexes[index++] = scene3d.height/42.5
                    vertexes[index++] = 0
                    vertexes[index++] = 0
                    vertexes[index++] = scene3d.height/40
                    return vertexes
                }
            }
        }
        LineMaterial {
            id: line_material3
            transparency: 1
            lineWidth: 2
            colorBound:Qt.vector3d(0,1,0)
        }
        PhongAlphaMaterial  {
            id: phong_alpha_material3
            alpha: 1
            ambient: 'green'
        }
        components: [config.IsWinGpuAmdCard()?line_material3:phong_alpha_material3, cartesion_geometry3]
    }
}