using System;
using System.Collections;
using System.Collections.Generic;
using Unigine;

[Component(PropertyGuid = "d1f2881b069d9ebee03db70515fa3ca0f9ebc77f")]
public class RednderHandsToImage : Component
{
    private Mirror mirror;
    [ShowInEditor] private PlayerDummy handViewCamera;
    [ShowInEditor] private Node parentViewMesh;
    [ShowInEditor] int width, height;
    private void Init()
    {
        mirror.m_type = "mid";
        mirror.position = new dvec3(0,0, -0.86514f);

        Mesh mesh = new Mesh();
        mesh.AddPlaneSurface("viewOnHand", 1.85995f, 1, 1);

        mirror.mesh = new ObjectMeshStatic(mesh);
        mirror.mesh.Transform = new mat4(MathLib.Translate(new vec3(mirror.position)) * MathLib.RotateX(90.0f));

        parentViewMesh.AddChild(mirror.mesh);

        Material mesh_base = Materials.FindManualMaterial("mesh_base");
        mirror.mesh.SetMaterial(mesh_base, 0);

        mirror.camera = handViewCamera;

        mirror.texture = new Texture();
        mirror.texture.Create2D(width, height, Texture.FORMAT_RGBA8, Texture.USAGE_RENDER);

        mirror.viewport = new Viewport();
    }

    private void Update()
    {
        Render();
    }

    private void Render()
    {
        Viewport viewport;
        viewport = mirror.viewport;

        RenderState.SaveState();
        RenderState.ClearStates();

        RenderState.PolygonFront = 1;

        viewport.RenderTexture2D(mirror.camera.Camera, mirror.texture);

        RenderState.PolygonFront = 0;
        RenderState.RestoreState();

        Material material = mirror.mesh.GetMaterialInherit(0);
        material.SetTexture(material.FindTexture("albedo"), mirror.texture);
    }
}
struct Mirror
{
    public String m_type;
    public ObjectMeshStatic mesh;                   // mirror mesh	
    public Texture texture;                         // mirror texture
    public PlayerDummy camera;                      // mirror camera
    public Viewport viewport;                       // mirror viewport
    public dvec3 position;                          // mirror position
};