// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
#include "resource.h"
#include "stdafx.h"

#include "Render Elements\MaxKrakatoaRenderElement.h"

#include <krakatoa/specular_render_element.hpp>

#define MaxKrakatoaSpecularRenderElement_CLASS_NAME _T("Krakatoa Specular")
#define MaxKrakatoaSpecularRenderElement_CLASS_ID Class_ID( 0x3a4d5bb7, 0x3c6b7426 )

class MaxKrakatoaSpecularRenderElement : public MaxKrakatoaRenderElement<MaxKrakatoaSpecularRenderElement> {
  protected:
    ClassDesc2* GetClassDesc();

  public:
    static void DefineParamBlock( ParamBlockDesc2* pParamDesc );

    MaxKrakatoaSpecularRenderElement();
    virtual ~MaxKrakatoaSpecularRenderElement();

    // From IKrakatoaRenderElement
    virtual krakatoa::render_element_interface* get_render_element( krakatoa::scene_context_ptr pSceneContext );

    // From ReferenceMaker
    virtual RefResult NotifyRefChanged( const Interval& changeInt, RefTargetHandle hTarget, PartID& partID,
                                        RefMessage message, BOOL propagate );
};

class MaxKrakatoaSpecularRenderElementDesc : public ClassDesc2 {
    ParamBlockDesc2* m_pParamDesc;

  public:
    MaxKrakatoaSpecularRenderElementDesc();
    virtual ~MaxKrakatoaSpecularRenderElementDesc();

    int IsPublic() { return TRUE; }
    void* Create( BOOL ) { return new MaxKrakatoaSpecularRenderElement; }
    const TCHAR* ClassName() { return MaxKrakatoaSpecularRenderElement_CLASS_NAME; }
#if MAX_VERSION_MAJOR >= 24
    const TCHAR* NonLocalizedClassName() { return MaxKrakatoaSpecularRenderElement_CLASS_NAME; }
#endif
    SClass_ID SuperClassID() { return RENDER_ELEMENT_CLASS_ID; }
    Class_ID ClassID() { return MaxKrakatoaSpecularRenderElement_CLASS_ID; }
    const TCHAR* Category() { return _T(""); }

    const TCHAR* InternalName() {
        return MaxKrakatoaSpecularRenderElement_CLASS_NAME;
    }                                           // returns fixed parsable name (scripter-visible name)
    HINSTANCE HInstance() { return hInstance; } // returns owning module handle
};

ClassDesc2* GetMaxKrakatoaSpecularRenderElementDesc() {
    static MaxKrakatoaSpecularRenderElementDesc theMaxKrakatoaSpecularRenderElementDesc;
    return &theMaxKrakatoaSpecularRenderElementDesc;
}

MaxKrakatoaSpecularRenderElementDesc::MaxKrakatoaSpecularRenderElementDesc() {
    m_pParamDesc = new ParamBlockDesc2( 0,                                            // Block num
                                        _T("Parameters"),                             // Internal name
                                        NULL,                                         // Localized name
                                        this,                                         // ClassDesc2*
                                        P_AUTO_CONSTRUCT | P_VERSION /*| P_AUTO_UI*/, // Flags
                                        0,                                            // Version
                                        0,                                            // PBlock Ref Num
                                        p_end );

    MaxKrakatoaSpecularRenderElement::DefineParamBlock( m_pParamDesc );
}

MaxKrakatoaSpecularRenderElementDesc::~MaxKrakatoaSpecularRenderElementDesc() {}

MaxKrakatoaSpecularRenderElement::MaxKrakatoaSpecularRenderElement() {
    GetMaxKrakatoaSpecularRenderElementDesc()->MakeAutoParamBlocks( this );
}

MaxKrakatoaSpecularRenderElement::~MaxKrakatoaSpecularRenderElement() {}

ClassDesc2* MaxKrakatoaSpecularRenderElement::GetClassDesc() { return GetMaxKrakatoaSpecularRenderElementDesc(); }

void MaxKrakatoaSpecularRenderElement::DefineParamBlock( ParamBlockDesc2* pParamDesc ) {
    MaxKrakatoaRenderElement<MaxKrakatoaSpecularRenderElement>::DefineParamBlock( pParamDesc );

    pParamDesc->ParamOption( kElementName, p_default, MaxKrakatoaSpecularRenderElement_CLASS_NAME, p_end );
}

krakatoa::render_element_interface*
MaxKrakatoaSpecularRenderElement::get_render_element( krakatoa::scene_context_ptr ) {
    std::auto_ptr<krakatoa::specular_render_element> pElement( new krakatoa::specular_render_element );

    pElement->register_commit_callback( boost::bind( &MaxKrakatoaSpecularRenderElement::write_back, this, _1 ) );

    return pElement.release();
}

RefResult MaxKrakatoaSpecularRenderElement::NotifyRefChanged( const Interval& /*changeInt*/, RefTargetHandle hTarget,
                                                              PartID& /*partID*/, RefMessage message,
                                                              BOOL /*propagate*/ ) {
    return REF_SUCCEED;
}