sMaterialDesc clASELoader::CreateMaterialFromASE( const sASEMaterial& ASEMaterial ) { if ( ASEMaterial.FName == "internal" ) { sMaterialDesc Mtl; // covert to engine's material - also check local dir for textures Mtl.FAmbientMap = LStringBuffer( Env->FileSystem->FindFile( ASEMaterial.FAmbientMap.FBitmap, FStream->GetVirtualFileName() ) ); Mtl.FDiffuseMap = LStringBuffer( Env->FileSystem->FindFile( ASEMaterial.FDiffuseMap.FBitmap, FStream->GetVirtualFileName() ) ); Mtl.FSpecularMap = LStringBuffer( Env->FileSystem->FindFile( ASEMaterial.FSpecularMap.FBitmap, FStream->GetVirtualFileName() ) ); Mtl.FBumpMap = LStringBuffer( Env->FileSystem->FindFile( ASEMaterial.FBumpMap.FBitmap, FStream->GetVirtualFileName() ) ); // convert colors Mtl.FProperties.FAmbientColor = LVector4( ASEMaterial.FAmbient, 1.0f ); Mtl.FProperties.FDiffuseColor = LVector4( ASEMaterial.FDiffuse, 1.0f ); Mtl.FProperties.FSpecularColor = LVector4( ASEMaterial.FSpecular, 1.0f ); Mtl.FProperties.FTransparency = ASEMaterial.FTransparency; return Mtl; } // check if we have material file with the same name as this ASE material // check local dir for material LString MatName = Env->FileSystem->FindFile( ASEMaterial.FName, FStream->GetVirtualFileName() ); LString TheFileName( Env->FileSystem->FileExists( MatName ) ? MatName : "MaterialSystem/default.material" ); // load material if it exists return Env->Resources->LoadMaterial( TheFileName )->GetMaterialDesc(); }
void clGUIWindow::PreRender() { clGUIDialogWindow::PreRender(); static const float ResizeCornerW = Env->GUI->GetDefaultResizeCornerWidth(); static const float ResizeCornerH = Env->GUI->GetDefaultResizeCornerHeight(); UpdateUniformsV( FResizeCornerShader, LVector4( GetX2(), GetY2(), GetX2() - ResizeCornerW, GetY2() + ResizeCornerH ) ); UpdateUniformsV( FResizeCornerHighlightShader, LVector4( GetX2(), GetY2(), GetX2() - ResizeCornerW, GetY2() + ResizeCornerH ) ); FResizeCornerHighlighted ? Env->Renderer->AddBuffer( FResizeCornerGeometry, FResizeCornerHighlightShader, 1, false ) : Env->Renderer->AddBuffer( FResizeCornerGeometry, FResizeCornerShader, 1, false ); static const float CloseButtonW = Env->GUI->GetDefaultCloseButtonWidth(); static const float CloseButtonH_D1 = Env->GUI->GetDefaultCloseButtonHeight_Delta1(); static const float CloseButtonH_D2 = Env->GUI->GetDefaultCloseButtonHeight_Delta2(); if ( FCloseButtonHighlighted ) { UpdateUniformsV( FCloseButtonHighlightShader, LVector4( GetX2() - CloseButtonW, GetY1() + CloseButtonH_D1, GetX2(), GetY1() + CloseButtonH_D2 ) ); Env->Renderer->AddBuffer( FCloseButtonGeometry, FCloseButtonHighlightShader, 1, false ); } else { UpdateUniformsV( FCloseButtonShader, LVector4( GetX2() - CloseButtonW, GetY1() + CloseButtonH_D1, GetX2(), GetY1() + CloseButtonH_D2 ) ); UpdateUniformsV( FCloseButtonCaptionHighlightedShader, LVector4( GetX2() - CloseButtonW, GetY1() + CloseButtonH_D1, GetX2(), GetY1() + CloseButtonH_D2 ) ); ContainsCaption( Local2Screen( GetMousePos() ) ) ? Env->Renderer->AddBuffer( FCloseButtonGeometry, FCloseButtonCaptionHighlightedShader, 1, false ) : Env->Renderer->AddBuffer( FCloseButtonGeometry, FCloseButtonShader, 1, false ); } }
//---------------------------------------------------------------------- // ● カメラ単位でシェーダに送るデータの取得 //---------------------------------------------------------------------- LNCameraSceneParam* Camera::getCameraSceneParam() { mCameraSceneParam.Mat_CameraView = &mCoreCamera.getViewMatrix(); mCameraSceneParam.Mat_CameraProj = &mCoreCamera.getProjectionMatrix(); mCameraSceneParam.Mat_CameraViewProj = &mCoreCamera.getViewProjectionMatrix(); mCameraSceneParam.CameraPosition = LVector4( mCoreCamera.getPosition(), 0.0f ); mCameraSceneParam.CameraDirection = LVector4( mCoreCamera.getDirection(), 0.0f ); mCameraSceneParam.calcMatrices(); return &mCameraSceneParam; }
bool LFrustum::IsSphereInFrustum( const LSphere& Sphere ) const { if ( Sphere.GetOrigin().SqrLength() < Linderdaum::Math::EPSILON /*IsZeroVector()*/ ) { return true; } LVector4 Point4 = LVector4( Sphere.GetOrigin(), 1.0f ); // int Planes = 0; for ( int i = 0; i != CheckPlanes; ++i ) { float Distance = FPlanes[i].Dot( Point4 ); // completely outside if ( Distance < -Sphere.GetRadius() ) { return false; } // partially inside if ( fabs( Distance ) < Sphere.GetRadius() ) { return true; } // if ( Distance > Sphere.GetRadius() ) Planes++; } // NOTE: Planes == CheckPlanes - full inside // Planes != CheckPlanes - partial inside return true; }
LMatrix4 clASELoader::ASE_ReadNodeTM( iIStream* FStream ) { LMatrix4 TM; TM.IdentityMatrix(); while ( !FStream->Eof() ) { LString Line = FStream->ReadLineTrimLeadSpaces(); if ( LStr::ContainsSubStr( Line, "}" ) ) { break; } else if ( LStr::StartsWith( Line, ASE_TMRow0 ) ) { TM[0] = LVector4( LStr::ToFloat( LStr::GetToken( Line, 2 ) ), LStr::ToFloat( LStr::GetToken( Line, 3 ) ), LStr::ToFloat( LStr::GetToken( Line, 4 ) ), 0.0 ); } else if ( LStr::StartsWith( Line, ASE_TMRow1 ) ) { TM[1] = LVector4( LStr::ToFloat( LStr::GetToken( Line, 2 ) ), LStr::ToFloat( LStr::GetToken( Line, 3 ) ), LStr::ToFloat( LStr::GetToken( Line, 4 ) ), 0.0 ); } else if ( LStr::StartsWith( Line, ASE_TMRow2 ) ) { TM[2] = LVector4( LStr::ToFloat( LStr::GetToken( Line, 2 ) ), LStr::ToFloat( LStr::GetToken( Line, 3 ) ), LStr::ToFloat( LStr::GetToken( Line, 4 ) ), 0.0 ); } else if ( LStr::StartsWith( Line, ASE_TMRow3 ) ) { TM[3] = LVector4( LStr::ToFloat( LStr::GetToken( Line, 2 ) ), LStr::ToFloat( LStr::GetToken( Line, 3 ) ), LStr::ToFloat( LStr::GetToken( Line, 4 ) ), 1.0 ); } else { ASE_SkipBlock( FStream, Line ); } } return TM; }
void clCanvas::TexturedRect2DClipped( float X1, float Y1, float X2, float Y2, const LVector4& Color, const clPtr<clGLTexture>& Texture, const LVector4& ClipRect ) { LGL3->glDisable( GL_DEPTH_TEST ); Texture->Bind( 0 ); FTexRectSP->Bind(); FTexRectSP->SetUniformNameVec4Array( "u_Color", 1, Color ); FTexRectSP->SetUniformNameVec4Array( "u_RectSize", 1, LVector4( X1, Y1, X2, Y2 ) ); FTexRectSP->SetUniformNameVec4Array( "u_Tiles", 1, LVector4( 1, 1, 0, 0 ) ); FTexRectSP->SetUniformNameVec4Array( "u_ClipRect", 1, ClipRect ); LGL3->glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); LGL3->glEnable( GL_BLEND ); FRectVA->Draw( false ); LGL3->glDisable( GL_BLEND ); }
//---------------------------------------------------------------------- // //---------------------------------------------------------------------- void CameraContext::updateContext() { mViewSize = mCamera->getViewSize(); mPosition = LVector4( mCamera->mCoreCamera.getPosition(), 0 ); mDirection = mCamera->mCoreCamera.getDirection(); mFovY = mCamera->mCoreCamera.getFovY(); mNearClip = mCamera->mCoreCamera.getNearClip(); mFarClip = mCamera->mCoreCamera.getFarClip(); mViewMatrix = mCamera->mCoreCamera.getViewMatrix(); mProjectionMatrix= mCamera->mCoreCamera.getProjectionMatrix(); mViewProjMatrix = mCamera->mCoreCamera.getViewProjectionMatrix(); mZSortFunc = mCamera->mZSortFunc; mCameraSceneParam.Mat_CameraView = &mViewMatrix; mCameraSceneParam.Mat_CameraProj = &mProjectionMatrix; mCameraSceneParam.Mat_CameraViewProj = &mViewProjMatrix; mCameraSceneParam.CameraPosition = mPosition; mCameraSceneParam.CameraDirection = LVector4( mDirection, 0.0f ); mCameraSceneParam.ViewPixelSize.Set( mViewSize.X, mViewSize.Y, 0, 0 ); mCameraSceneParam.calcMatrices(); mProjection2D = mCamera->isProjection2D(); mOrthographic = mCamera->mOrthographic; this->mRenderRootNode = mCamera->mRenderRootNode; // LN_REFOBJ_SET( this->mRenderTarget, mCamera->mRenderTarget ); #if LNOTE_SCENE_CAMERA_SCREEN_EFFECT LN_REFOBJ_SET( this->mScreenEffect, mCamera->mScreenEffect ); this->mBackgroundColor = mCamera->mBackgroundColor; #endif }
void clGUISlider::PostRender() { clGUIPanel::PostRender(); UpdateUniformsV( FSlideBarShader, GetSliderCoords() ); Env->Renderer->AddBuffer( FSlideBarGeometry, FSlideBarShader, 1, false ); if ( FShowValue ) { OutTextXY( 0.0, 0.0, LStr::ToStr( GetCurrentValue() ), LVector4( 1.0f, 0.0f, 0.0f, 0.5f ) ); } }
bool LFrustum::IsPointInFrustum( const LVector3& Point ) const { LVector4 Point4 = LVector4( Point, 1.0f ); for ( int i = 0; i != CheckPlanes; ++i ) { if ( FPlanes[i].Dot( Point4 ) <= 0 ) { return false; } } return true; }
LVector4 clGUISlider::GetSliderCoords() { if ( FCurrentValue < 0 ) { FCurrentValue = 0; } if ( FCurrentValue > GetWidth() - SliderWidth ) { FCurrentValue = GetWidth() - SliderWidth; } float dX1 = FCurrentValue; float dX2 = FCurrentValue + SliderWidth; return LVector4( GetX1() + dX1, GetY1(), GetX1() + dX2, GetY2() ); }
LVector4 clGUIGauge::GetUniformsVec() const { static const float OffsetX = Env->GUI->GetDefaultGaugeXOffset(); static const float OffsetY = Env->GUI->GetDefaultGaugeYOffset(); float Percent = 1.0f; if ( FMaxValue > 0 ) { Percent = static_cast<float>( FCurrentValue ) / static_cast<float>( FMaxValue ); } float BarLen = ( GetX2() - GetX1() ) * Percent; return LVector4( GetX1() + OffsetX, GetY1() + OffsetY, GetX1() + BarLen/*-OffsetX*/, GetY2() - OffsetY ); }
void clGUIColorDial::SetAlpha( const LVector2& Pnt ) { LVector2 dP = Screen2Local( Pnt ); dP = LVector2( dP.X / GetWidth(), dP.Y / GetHeight() ); float nx = ( dP.X - 0.5f ) * 2.0f; float ny = ( dP.Y - 0.5f ) * 2.0f; float r = sqrt( nx * nx + ny * ny ); float r_min = FRMin; LVector2 p_color = -Math::ToPolar( r_min, FAlpha ); LVector2 p_white = -Math::ToPolar( r_min, FAlpha + 120.0f ); LVector2 p_black = -Math::ToPolar( r_min, FAlpha + 240.0f ); LVector3 Mark = LVector3( FMousePoint.X * p_black + FMousePoint.Y * p_white + FMousePoint.Z * p_color, 1.0f ); DialSP->BindUniforms(); DialSP->SetUniformVec3Array( FMousePtUniform, 1, Mark ); if ( r < FRMax && r > FRMin ) { FAlpha = 180.0f + Linderdaum::Math::RadToDeg( atan2( ny, nx ) ); DialSP->SetUniformFloat( FAlphaUniform, FAlpha ); } else { LVector3 NewB = Math::Barycentric2D( nx, ny, p_black.X, p_black.Y, p_white.X, p_white.Y, p_color.X, p_color.Y ); if ( NewB.X >= 0 && NewB.X <= 1 && NewB.Y >= 0 && NewB.Y <= 1 && NewB.Z >= 0 && NewB.Z <= 1 ) { FMousePoint = NewB; } } LVector3 CC = FMousePoint.X * LC_Black.ToVector3() + FMousePoint.Y * LC_White.ToVector3() + FMousePoint.Z * Math::ColorFromAngle( FAlpha ); Env->Console->GetVar( FOutVarName )->SetVector4( LVector4( CC, 1.0f ) ); }
void clCanvas::Rect2D( float X1, float Y1, float X2, float Y2, const LVector4& Color ) { LGL3->glDisable( GL_DEPTH_TEST ); FRectSP->Bind(); FRectSP->SetUniformNameVec4Array( "u_Color", 1, Color ); FRectSP->SetUniformNameVec4Array( "u_RectSize", 1, LVector4( X1, Y1, X2, Y2 ) ); if ( Color.w < 1.0f ) { LGL3->glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); LGL3->glEnable( GL_BLEND ); } FRectVA->Draw( false ); if ( Color.w < 1.0f ) { LGL3->glDisable( GL_BLEND ); } }