2017-03-15 19:29:34 +00:00
|
|
|
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
|
|
// Copyright (C) 2010 Winch Gate Property Limited
|
|
|
|
//
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Affero General Public License as
|
|
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Affero General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
#include "std_afx.h"
|
|
|
|
#include "blend_wnd.h"
|
|
|
|
#include <nel/misc/common.h>
|
|
|
|
#include <nel/3d/animation_playlist.h>
|
|
|
|
|
|
|
|
using namespace NL3D;
|
|
|
|
using namespace NLMISC;
|
|
|
|
|
|
|
|
#define COLOR_BLEND_ENABLE (RGB(192, 43, 223))
|
|
|
|
#define COLOR_BLEND_DISABLE (RGB(140, 113, 142))
|
|
|
|
#define SEGMENT_COUNT 10
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
|
|
|
|
|
|
CBlendWnd::CBlendWnd()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
|
|
|
|
|
|
void CBlendWnd::MakePoint (const RECT& src, POINT& dst, float x, float y)
|
|
|
|
{
|
|
|
|
float widthClient=(float)src.right-(float)src.left;
|
|
|
|
float heightClient=(float)src.bottom-(float)src.top;
|
|
|
|
dst.x=src.left+(int)(widthClient*x);
|
|
|
|
dst.y=src.top+(int)(heightClient*y);
|
|
|
|
}
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
|
|
|
|
|
|
void CBlendWnd::MakeRect (const RECT& src, RECT& dst, float x, float y, float width, float height)
|
|
|
|
{
|
|
|
|
float widthClient=(float)src.right-(float)src.left;
|
|
|
|
float heightClient=(float)src.bottom-(float)src.top;
|
|
|
|
dst.left=src.left+(int)(widthClient*x);
|
|
|
|
dst.top=src.top+(int)(heightClient*y);
|
|
|
|
dst.right=src.left+(int)(widthClient*(x+width));
|
|
|
|
dst.bottom=src.top+(int)(heightClient*(y+height));
|
|
|
|
}
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
|
|
|
|
|
|
void CBlendWnd::OnPaint (const RECT& client, CDC* pDc, float StartBlend, float EndBlend, float StartBlendTime, float EndBlendTime,
|
|
|
|
float Smoothness, float StartTime, float EndTime, bool enabled)
|
|
|
|
{
|
|
|
|
// Get the good color
|
|
|
|
COLORREF color=(enabled?COLOR_BLEND_ENABLE:COLOR_BLEND_DISABLE);
|
|
|
|
|
|
|
|
// *** Paint the left rect
|
|
|
|
|
|
|
|
// Offset start
|
|
|
|
float offsetLeft=(StartBlendTime-StartTime)/(EndTime-StartTime);
|
|
|
|
clamp (offsetLeft, 0, 1);
|
|
|
|
|
|
|
|
// Fill the background
|
|
|
|
pDc->FillSolidRect(&client, GetSysColor (COLOR_SCROLLBAR));
|
|
|
|
|
|
|
|
// Make a rect for left
|
|
|
|
RECT left;
|
|
|
|
MakeRect (client, left, 0.f, 1.f-StartBlend, offsetLeft, StartBlend);
|
|
|
|
pDc->FillSolidRect(&left, color);
|
|
|
|
|
|
|
|
// *** Paint the right rect
|
|
|
|
|
|
|
|
// Offset start
|
|
|
|
float offsetRight=(EndBlendTime-StartTime)/(EndTime-StartTime);
|
|
|
|
clamp (offsetRight, 0, 1);
|
|
|
|
|
|
|
|
// Make a rect for left
|
|
|
|
RECT right;
|
|
|
|
MakeRect (client, right, offsetRight, 1.f-EndBlend, 1.f-offsetRight, EndBlend);
|
|
|
|
pDc->FillSolidRect(&right, color);
|
|
|
|
|
|
|
|
// *** Paint the inter zone
|
|
|
|
|
|
|
|
// Set pen and brush color
|
|
|
|
CPen myPen (PS_NULL, 0, color);
|
|
|
|
CBrush myBrush (color);
|
|
|
|
CPen* oldPen=NULL;
|
|
|
|
CBrush* oldBrush=NULL;
|
|
|
|
|
|
|
|
// Then initialize it
|
|
|
|
oldPen=pDc->SelectObject (&myPen);
|
|
|
|
oldBrush=pDc->SelectObject (&myBrush);
|
|
|
|
|
|
|
|
for (uint i=0; i<SEGMENT_COUNT; i++)
|
|
|
|
{
|
|
|
|
// Offset of the polygon
|
|
|
|
float firstOffset=offsetLeft+(float)i*(offsetRight-offsetLeft)/(float)SEGMENT_COUNT;
|
|
|
|
float nextOffset=offsetLeft+(float)(i+1)*(offsetRight-offsetLeft)/(float)SEGMENT_COUNT;
|
|
|
|
|
|
|
|
// Get time
|
|
|
|
float firstTime=StartBlendTime+(float)i*(EndBlendTime-StartBlendTime)/(float)SEGMENT_COUNT;
|
|
|
|
float nextTime=StartBlendTime+(float)(i+1)*(EndBlendTime-StartBlendTime)/(float)SEGMENT_COUNT;
|
|
|
|
|
|
|
|
// Get the values
|
|
|
|
float firstValue=CAnimationPlaylist::getWeightValue (StartBlendTime, EndBlendTime, firstTime, StartBlend, EndBlend, Smoothness);
|
|
|
|
float nextValue=CAnimationPlaylist::getWeightValue (StartBlendTime, EndBlendTime, nextTime, StartBlend, EndBlend, Smoothness);
|
|
|
|
|
|
|
|
// Setup polygon points
|
|
|
|
POINT polygon[4];
|
|
|
|
MakePoint (client, polygon[0], firstOffset, 1.f);
|
|
|
|
MakePoint (client, polygon[1], firstOffset, 1.f-firstValue);
|
|
|
|
MakePoint (client, polygon[2], nextOffset, 1.f-nextValue);
|
|
|
|
MakePoint (client, polygon[3], nextOffset, 1.f);
|
|
|
|
|
|
|
|
// Draw the polygon
|
|
|
|
pDc->Polygon (polygon, 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Draw limit line
|
|
|
|
CPen myBlackPen (PS_SOLID, 1, RGB(0,0,0));
|
|
|
|
pDc->SelectObject (&myBlackPen);
|
|
|
|
|
|
|
|
POINT p0;
|
|
|
|
POINT p1;
|
|
|
|
//MakePoint (client, p0, offsetLeft, 1.f-StartBlend);
|
|
|
|
MakePoint (client, p0, offsetLeft, 0.f);
|
|
|
|
MakePoint (client, p1, offsetLeft, 1.f);
|
|
|
|
pDc->MoveTo (p0);
|
|
|
|
pDc->LineTo (p1);
|
|
|
|
//MakePoint (client, p0, offsetRight, 1.f-EndBlend);
|
|
|
|
MakePoint (client, p0, offsetRight, 0.f);
|
|
|
|
MakePoint (client, p1, offsetRight, 1.f);
|
|
|
|
pDc->MoveTo (p0);
|
|
|
|
pDc->LineTo (p1);
|
|
|
|
|
|
|
|
// Make frame
|
|
|
|
pDc->MoveTo (client.left, client.top);
|
|
|
|
pDc->LineTo (client.right, client.top);
|
|
|
|
pDc->LineTo (client.right, client.bottom);
|
|
|
|
pDc->LineTo (client.left, client.bottom);
|
|
|
|
pDc->LineTo (client.left, client.top);
|
|
|
|
|
|
|
|
// Then reselect old object
|
|
|
|
pDc->SelectObject (oldPen);
|
|
|
|
pDc->SelectObject (oldBrush);
|
|
|
|
}
|
|
|
|
|
|
|
|
// ***************************************************************************
|