00001 #include "vuSphVwFlt_Blend.h"
00002 #include <math.h>
00003
00004 template <int S, class T>
00005 vuSphVwFlt_Blend<S,T>::vuSphVwFlt_Blend()
00006 {
00007 }
00008
00009 template <int S, class T>
00010 vuSphVwFlt_Blend<S,T>::vuSphVwFlt_Blend(const vuString& filterName)
00011 : vuSphericViewFilter<S,T>(filterName)
00012 {
00013 }
00014
00015 template <int S, class T>
00016 void vuSphVwFlt_Blend<S,T>::filter(vuCamera *camera)
00017 {
00018 if (m_NumberOfViews > 0) {
00019 float *factors = new float[m_NumberOfViews];
00020 float sum = 0.0f;
00021 vuVector cameraLookAt = camera->getLookAtVector().makeUnit();
00022 vuVector cameraUp = camera->getUpVector().makeUnit();
00023 vuVector cameraRight = camera->getRightVector().makeUnit();
00024
00025
00026 for (dword i=0; i<m_NumberOfViews; i++) {
00027 factors[i] = _factor(i, cameraLookAt);
00028 sum += factors[i];
00029 cerr << factors[i] << ", ";
00030 }
00031
00032 for (dword i=0; i<m_NumberOfViews; i++) factors[i] /= sum;
00033
00034 vuVector viewUp;
00035 float angle, dot;
00036
00037
00038 *m_Image = *m_Views[0]->getMap();
00039 *m_Image *= factors[0];
00040
00041 viewUp = m_Views[0]->getUp().makeUnit();
00042 angle = acos(cameraUp.dot(viewUp)) * 180 / M_PI;
00043 dot = cameraRight.dot(viewUp);
00044 if (dot >= 0) angle *= -1;
00045 m_Image->rotate(angle);
00046
00047
00048 if (m_NumberOfViews > 1) {
00049 vuFixelMap<S,T> tmp(m_Image->getWidth(), m_Image->getHeight());
00050
00051 for (dword i=1; i<m_NumberOfViews; i++) {
00052 viewUp = m_Views[i]->getUp().makeUnit();
00053 angle = acos(cameraUp.dot(viewUp)) * 180 / M_PI;
00054 dot = cameraRight.dot(viewUp);
00055 if ( dot >= 0) angle *= -1;
00056
00057 tmp = *m_Views[i]->getMap();
00058 tmp *= factors[i];
00059 tmp.rotate(angle);
00060
00061 *m_Image += tmp;
00062 }
00063 }
00064 }
00065 else
00066 log("vuSphVwFlt_Blend.filter(): m_NumberOfViews=0");
00067 }
00068
00069 template <int S, class T>
00070 float vuSphVwFlt_Blend<S,T>::_factor(dword idx, const vuVector &XX)
00071 {
00072 float result = 1.0f;
00073 vuVector XXj = m_Views[idx]->getLookFrom().makeUnit() * -1;
00074 vuVector XXi;
00075
00076 for (dword i=0; i < m_NumberOfViews; i++) {
00077 if (i != idx) {
00078 XXi = m_Views[i]->getLookFrom().makeUnit() * -1;
00079 result *= ((XX - XXi).norm() / (XXj - XXi).norm());
00080 }
00081 }
00082 return result;
00083 }