khanat-opennel-code/code/nel/tools/3d/object_viewer/blend_wnd.cpp
2011-05-30 17:05:13 +02:00

156 lines
5.3 KiB
C++

// 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);
}
// ***************************************************************************