/* ** Command & Conquer Renegade(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU 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 General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ /*********************************************************************************************** *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S *** *********************************************************************************************** * * * Project Name : Combat * * * * $Archive:: /Commando/Code/wwui/stylemgr.cpp $* * * * Author:: Patrick Smith * * * * $Modtime:: 1/26/02 1:23p $* * * * $Revision:: 33 $* * * *---------------------------------------------------------------------------------------------* * Functions: * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Disable warning about exception handling not being enabled. It's used as part of STL - in a part of STL we don't use. #pragma warning(disable : 4530) #include "stylemgr.h" #include "render2d.h" #include "assetmgr.h" #include "texture.h" #include "font3d.h" #include "render2dsentence.h" #include "ini.h" #include "ffactory.h" #include "wwaudio.h" //////////////////////////////////////////////////////////////// // Local constants //////////////////////////////////////////////////////////////// static const char * DEFAULT_BACKDROP_NAME = "GRADENT_TEST.TGA"; struct FONT_DESC { const char * name; int point_size; bool is_bold; }; static FONT_DESC DEFAULT_FONTS[StyleMgrClass::FONT_MAX] = { { "Regatta Condensed LET", 52, false }, { "Arial MT", 12, true }, { "Arial MT", 8, true }, { "Arial MT", 8, false }, { "Arial MT", 8, false }, { "Regatta Condensed LET", 32, false }, { "Regatta Condensed LET", 20, false }, { "Arial MT", 9, true }, { "Arial MT", 12, true }, { "Arial MT", 10, false }, { "Arial MT", 10, true }, { "Arial MT", 8, false }, { "Arial MT", 16, false }, { "Arial MT", 14, false }, { "Arial MT", 9, true } /*{ "Arial Unicode MS", 52, false }, { "Arial Unicode MS", 12, true }, { "Arial Unicode MS", 12, true }, { "Arial Unicode MS", 12, false }, { "Arial Unicode MS", 12, false }, { "Arial Unicode MS", 32, false }, { "Arial Unicode MS", 20, false }, { "Arial Unicode MS", 13, true }, { "Arial Unicode MS", 14, true }*/ }; //////////////////////////////////////////////////////////////// // Local constants //////////////////////////////////////////////////////////////// TextureClass * StyleMgrClass::BackdropTexture = NULL; uint32 StyleMgrClass::TitleColor = RGB_TO_INT32 (255, 255, 255); uint32 StyleMgrClass::TitleHilightColor = RGB_TO_INT32 (255, 255, 0); uint32 StyleMgrClass::TitleShadowColor = RGB_TO_INT32 (0, 0, 0); uint32 StyleMgrClass::TextColor = RGB_TO_INT32 (255, 213, 40); uint32 StyleMgrClass::TextShadowColor = RGBA_TO_INT32 (0, 0, 0, 200); uint32 StyleMgrClass::LineColor = RGB_TO_INT32 (255, 174, 40); uint32 StyleMgrClass::BkColor = RGBA_TO_INT32 (255, 174, 40, 40); uint32 StyleMgrClass::DisabledTextColor = RGBA_TO_INT32 (255, 213, 40, 140); uint32 StyleMgrClass::DisabledTextShadowColor = RGBA_TO_INT32 (0, 0, 0, 96); uint32 StyleMgrClass::DisabledLineColor = RGBA_TO_INT32 (230, 160, 35, 128); uint32 StyleMgrClass::DisabledBkColor = RGBA_TO_INT32 (255, 174, 40, 30); uint32 StyleMgrClass::HilightColor = RGB_TO_INT32 (70, 70, 70); uint32 StyleMgrClass::TabTextColor = RGB_TO_INT32 (255, 255, 255); uint32 StyleMgrClass::TabGlowColor = RGB_TO_INT32 (16, 10, 0); FontCharsClass * StyleMgrClass::Fonts[FONT_MAX] = { NULL }; float StyleMgrClass::ScaleX = 1.0F; float StyleMgrClass::ScaleY = 1.0F; DynamicVectorClass StyleMgrClass::FontFileList; StringClass StyleMgrClass::EventAudioList[StyleMgrClass::EVENT_AUDIO_MAX]; //////////////////////////////////////////////////////////////// // // Initialize // //////////////////////////////////////////////////////////////// void StyleMgrClass::Initialize (void) { // // Compute the scale // ScaleX = Render2DClass::Get_Screen_Resolution().Width () / 800.0F; ScaleY = Render2DClass::Get_Screen_Resolution().Height () / 600.0F; // // Load each font // for (int index = 0; index < FONT_MAX; index ++) { // // Scale the point size to fit this resolution // float point_size = ((float)DEFAULT_FONTS[index].point_size) * ScaleY; // // Create the font // Fonts[index] = WW3DAssetManager::Get_Instance()->Get_FontChars (DEFAULT_FONTS[index].name, point_size, DEFAULT_FONTS[index].is_bold); } // // Load the backdrop texture name // BackdropTexture = WW3DAssetManager::Get_Instance()->Get_Texture (DEFAULT_BACKDROP_NAME, TextureClass::MIP_LEVELS_1); return ; } //////////////////////////////////////////////////////////////// // // Initialize_From_INI // //////////////////////////////////////////////////////////////// void StyleMgrClass::Initialize_From_INI (const char *filename) { Shutdown (); // // Compute the scale // ScaleX = Render2DClass::Get_Screen_Resolution().Width () / 800.0F; ScaleY = Render2DClass::Get_Screen_Resolution().Height () / 600.0F; // // Get the INI file // INIClass *ini_file = NULL; FileClass *file_obj = _TheFileFactory->Get_File (filename); if (file_obj != NULL && file_obj->Is_Available( ) ) { ini_file = new INIClass (*file_obj); _TheFileFactory->Return_File (file_obj); } if (ini_file != NULL) { const char *FONT_FILE_SECTION = "Font File List"; const char *FONT_NAME_SECTION = "Font Names"; const char *FONT_INI_ENTRIES[FONT_MAX] = { "FONT_TITLE", "FONT_LG_CONTROLS", "FONT_CONTROLS", "FONT_LISTS", "FONT_TOOLTIPS", "FONT_MENU", "FONT_SM_MENU", "FONT_HEADER", "FONT_BIG_HEADER", "FONT_CREDITS", "FONT_CREDITS_BOLD", "FONT_INGAME_TXT", "FONT_INGAME_BIG_TXT", "FONT_INGAME_SUBTITLE_TXT", "FONT_INGAME_HEADER_TXT" }; // // Load each font into windows // int count = ini_file->Entry_Count (FONT_FILE_SECTION); for (int index = 0; index < count; index ++) { StringClass filename (0, true); ini_file->Get_String (filename, FONT_FILE_SECTION, ini_file->Get_Entry (FONT_FILE_SECTION, index)); // // Install the font into windows // ::AddFontResource (filename); FontFileList.Add (filename); } // // Read information about each font and load it into the system // for (index = 0; index < FONT_MAX; index ++) { // // Read information about this font // StringClass font_entry; ini_file->Get_String (font_entry, FONT_NAME_SECTION, FONT_INI_ENTRIES[index]); // // Parse the information // StringClass font_name = ::strtok (font_entry.Peek_Buffer (), ","); StringClass font_size = ::strtok (NULL, ","); StringClass font_bold = ::strtok (NULL, ","); bool is_bold = (::atoi (font_bold) != 0); // // Scale the point size to fit this resolution // float point_size = ((float)::atoi (font_size)) * ScaleY; // // Remove bold from "small" fonts if they're scaled down // point_size = max (point_size, 8.0F); if (point_size < 10.0F && ScaleY < 1.0F) { is_bold = false; } // // Create the font // Fonts[index] = WW3DAssetManager::Get_Instance()->Get_FontChars (font_name, point_size, is_bold); } // // Audio section constants // const char *AUDIO_SECTION = "Audio"; const char *AUDIO_CLICK = "AUDIO_CLICK"; const char *AUDIO_MOUSEOVER = "AUDIO_MOUSEOVER"; const char *AUDIO_BACK = "AUDIO_BACK"; const char *AUDIO_POPUP = "AUDIO_POPUP"; // // Read information about the sound effects // ini_file->Get_String (EventAudioList[EVENT_MOUSE_CLICK], AUDIO_SECTION, AUDIO_CLICK); ini_file->Get_String (EventAudioList[EVENT_MOUSE_OVER], AUDIO_SECTION, AUDIO_MOUSEOVER); ini_file->Get_String (EventAudioList[EVENT_MENU_BACK], AUDIO_SECTION, AUDIO_BACK); ini_file->Get_String (EventAudioList[EVENT_POPUP], AUDIO_SECTION, AUDIO_POPUP); // // Free the ini file // delete ini_file; ini_file = NULL; } return ; } //////////////////////////////////////////////////////////////// // // Shutdown // //////////////////////////////////////////////////////////////// void StyleMgrClass::Shutdown (void) { // // Free each font // for (int index = 0; index < FONT_MAX; index ++) { REF_PTR_RELEASE (Fonts[index]); } // // Unregister this font with windows // for (index = 0; index < FontFileList.Count (); index ++) { ::RemoveFontResource (FontFileList[index]); } // // Free the backdrop texture // REF_PTR_RELEASE (BackdropTexture); return ; } //////////////////////////////////////////////////////////////// // // Get_Font // //////////////////////////////////////////////////////////////// FontCharsClass * StyleMgrClass::Get_Font (FONT_STYLE style) { FontCharsClass *font = Fonts[style]; if (font != NULL) { font->Add_Ref (); } return font; } //////////////////////////////////////////////////////////////// // // Render_Backdrop // //////////////////////////////////////////////////////////////// void StyleMgrClass::Render_Backdrop (Render2DClass *renderer, const RectClass &rect) { // // Simply set the texture, and render a quad filling the rectangle // renderer->Set_Texture (BackdropTexture); renderer->Add_Quad (rect, RectClass (0, 0, 1, 1)); return ; } //////////////////////////////////////////////////////////////// // // Assign_Font // //////////////////////////////////////////////////////////////// void StyleMgrClass::Assign_Font (Render2DSentenceClass *renderer, FONT_STYLE style) { renderer->Set_Font (Fonts[style]); return ; } //////////////////////////////////////////////////////////////// // // Render_Text // //////////////////////////////////////////////////////////////// /*void StyleMgrClass::Render_Text ( const WCHAR * text, Render2DTextClass * renderer, int x_pos, int y_pos, bool do_shadow, const RectClass * clipping_rect, bool is_enabled ) { // // If necessary, assign the clipping rectangle // if (clipping_rect != NULL) { renderer->Set_Clipping_Rect (*clipping_rect); } // // Determine what color to render the text in // int text_color = TextColor; int shadow_color = TextShadowColor; if (is_enabled == false) { text_color = DisabledTextColor; shadow_color = DisabledTextShadowColor; } // // Render the shadow (if necessary) // if (do_shadow) { renderer->Set_Location (Vector2 (x_pos - 1, y_pos + 1)); renderer->Draw_Text (text, shadow_color); } // // Set the position where text will be drawn // renderer->Set_Location (Vector2 (x_pos, y_pos)); // // Draw the text // renderer->Draw_Text (text, text_color); return ; }*/ //////////////////////////////////////////////////////////////// // // Render_Title_Text // //////////////////////////////////////////////////////////////// void StyleMgrClass::Render_Title_Text ( const WCHAR * text, Render2DSentenceClass * renderer, const RectClass & rect ) { // // Set the clipping rectangle // //renderer->Set_Clipping_Rect (rect); // // Get the extents of the text we will be drawing // Vector2 text_extent = renderer->Get_Text_Extents (text); // // Center the text // int x_pos = int(rect.Left + (rect.Width () / 2) - (text_extent.X / 2)); int y_pos = int(rect.Top + (rect.Height () / 2) - (text_extent.Y / 2)); // // Build the textures for the text we'll be drawing // renderer->Build_Sentence (text); // // Draw the shadow // renderer->Set_Location (Vector2 (x_pos - 1, y_pos - 1)); renderer->Draw_Sentence (TitleShadowColor); // // Draw the hilight // renderer->Set_Location (Vector2 (x_pos + 1, y_pos + 1)); renderer->Draw_Sentence (TitleHilightColor); // // Draw the text // renderer->Set_Location (Vector2 (x_pos, y_pos)); renderer->Draw_Sentence (TitleColor); return ; } //////////////////////////////////////////////////////////////// // // Render_Text // //////////////////////////////////////////////////////////////// void StyleMgrClass::Render_Text ( const WCHAR * text, Render2DSentenceClass * renderer, const RectClass & rect, bool do_shadow, bool do_clip, JUSTIFICATION justify, bool is_enabled, bool is_vcentered ) { // // Determine what color to render the text in // int text_color = TextColor; int shadow_color = TextShadowColor; if (is_enabled == false) { text_color = DisabledTextColor; shadow_color = DisabledTextShadowColor; } Render_Text (text, renderer, text_color, shadow_color, rect, do_shadow, do_clip, justify, is_vcentered); return ; } //////////////////////////////////////////////////////////////// // // Render_Text // //////////////////////////////////////////////////////////////// void StyleMgrClass::Render_Text ( const WCHAR * text, Render2DSentenceClass * renderer, uint32 text_color, uint32 shadow_color, const RectClass & rect, bool do_shadow, bool do_clip, JUSTIFICATION justify, bool is_vcentered ) { // // If necessary, assign the clipping rectangle // if (do_clip) { renderer->Set_Clipping_Rect (rect); } // // Get the extents of the text we will be drawing // Vector2 text_extent = renderer->Get_Text_Extents (text); // // Assume left justification // int x_pos = rect.Left + 1; int y_pos = int(rect.Top + (rect.Height () / 2) - (text_extent.Y / 2)); if (is_vcentered == false) { y_pos = rect.Top; } // // Handle other justifications // if (justify == RIGHT_JUSTIFY) { // // Caclulate right justification // x_pos = int(rect.Right - text_extent.X); } else if (justify == CENTER_JUSTIFY) { // // Calculate center justification // x_pos = int(rect.Left + (rect.Width () / 2) - (text_extent.X / 2)); } // // Construct the textures needed to render the text // renderer->Build_Sentence (text); // // Render the shadow (if necessary) // if (do_shadow) { renderer->Set_Location (Vector2 (x_pos - 1, y_pos + 1)); renderer->Draw_Sentence (shadow_color); } // // Render the text // renderer->Set_Location (Vector2 (x_pos, y_pos)); renderer->Draw_Sentence (text_color); return ; } //////////////////////////////////////////////////////////////// // // Render_Text // //////////////////////////////////////////////////////////////// /*void StyleMgrClass::Render_Text ( const WCHAR * text, Render2DTextClass * renderer, uint32 text_color, uint32 shadow_color, const RectClass & rect, bool do_shadow, bool do_clip, JUSTIFICATION justify ) { // // If necessary, assign the clipping rectangle // if (do_clip) { renderer->Set_Clipping_Rect (rect); } // // Get the extents of the text we will be drawing // Vector2 text_extent = renderer->Get_Text_Extents (text); // // Assume left justification // int x_pos = rect.Left + 1; int y_pos = int(rect.Top + (rect.Height () / 2) - (text_extent.Y / 2)); // // Handle other justifications // if (justify == RIGHT_JUSTIFY) { // // Caclulate right justification // x_pos = int(rect.Right - text_extent.X); } else if (justify == CENTER_JUSTIFY) { // // Calculate center justification // x_pos = int(rect.Left + (rect.Width () / 2) - (text_extent.X / 2)); } // // Render the shadow (if necessary) // if (do_shadow) { renderer->Set_Location (Vector2 (x_pos - 1, y_pos + 1)); renderer->Draw_Text (text, shadow_color); } // // Render the text // renderer->Set_Location (Vector2 (x_pos, y_pos)); renderer->Draw_Text (text, text_color); return ; }*/ //////////////////////////////////////////////////////////////// // // Render_Text // //////////////////////////////////////////////////////////////// /*void StyleMgrClass::Render_Text ( const WCHAR * text, Render2DSentenceClass * renderer, uint32 text_color, uint32 shadow_color, const RectClass & rect, bool do_shadow, bool do_clip, JUSTIFICATION justify ) { // // If necessary, assign the clipping rectangle // if (do_clip) { renderer->Set_Clipping_Rect (rect); } // // Get the extents of the text we will be drawing // Vector2 text_extent = renderer->Get_Text_Extents (text); // // Assume left justification // int x_pos = rect.Left + 1; int y_pos = int(rect.Top + (rect.Height () / 2) - (text_extent.Y / 2)); // // Handle other justifications // if (justify == RIGHT_JUSTIFY) { // // Caclulate right justification // x_pos = int(rect.Right - text_extent.X); } else if (justify == CENTER_JUSTIFY) { // // Calculate center justification // x_pos = int(rect.Left + (rect.Width () / 2) - (text_extent.X / 2)); } // // Build up the text we want to render // renderer->Build_Sentence (text); // // Render the shadow (if necessary) // if (do_shadow) { renderer->Set_Location (Vector2 (x_pos - 1, y_pos + 1)); renderer->Draw_Sentence (shadow_color); } // // Render the text // renderer->Set_Location (Vector2 (x_pos, y_pos)); renderer->Draw_Sentence (text_color); return ; }*/ //////////////////////////////////////////////////////////////// // // Render_Wrapped_Text // //////////////////////////////////////////////////////////////// void StyleMgrClass::Render_Wrapped_Text ( const WCHAR * text, Render2DSentenceClass * renderer, const RectClass & rect, bool do_shadow, bool do_vcenter, bool is_enabled ) { // // Determine what color to render the text in // int text_color = TextColor; int shadow_color = TextShadowColor; if (is_enabled == false) { text_color = DisabledTextColor; shadow_color = DisabledTextShadowColor; } // // Render the text // Render_Wrapped_Text (text, renderer, text_color, shadow_color, rect, do_shadow, do_vcenter); return ; } //////////////////////////////////////////////////////////////// // // Render_Wrapped_Text // //////////////////////////////////////////////////////////////// void StyleMgrClass::Render_Wrapped_Text_Ex ( const WCHAR * text, Render2DSentenceClass * renderer, const RectClass & rect, bool do_shadow, bool do_vcenter, bool is_enabled, JUSTIFICATION justify ) { // // Determine what color to render the text in // int text_color = TextColor; int shadow_color = TextShadowColor; if (is_enabled == false) { text_color = DisabledTextColor; shadow_color = DisabledTextShadowColor; } // // Render the text // Render_Wrapped_Text_Ex (text, renderer, text_color, shadow_color, rect, do_shadow, do_vcenter, justify); return ; } //////////////////////////////////////////////////////////////// // // Render_Wrapped_Text // //////////////////////////////////////////////////////////////// void StyleMgrClass::Render_Wrapped_Text_Ex ( const WCHAR * text, Render2DSentenceClass * renderer, uint32 text_color, uint32 shadow_color, const RectClass & rect, bool do_shadow, bool do_vcenter, JUSTIFICATION justify ) { // // Enable wrapping // renderer->Set_Wrapping_Width (rect.Width ()); renderer->Set_Clipping_Rect (rect); // // First, get the number of lines of text // int row_count = 0; renderer->Get_Formatted_Text_Extents (text, &row_count); // // Calculate where to start spitting out the text // float text_height = renderer->Peek_Font ()->Get_Char_Height (); RectClass curr_rect = rect; if (do_vcenter) { curr_rect.Top = int(rect.Center ().Y - ((row_count * text_height) * 0.5F)); } // // Handy macro // #define COPY_LINE(dest, src_start, src_end) \ if (src_end == NULL) { \ dest = src_start; \ } else { \ uint32 bytes = ((uint32)src_end - (uint32)src_start); \ uint32 len = bytes / sizeof (WCHAR); \ ::memcpy (dest.Get_Buffer (len + 1), src_start, bytes); \ dest.Peek_Buffer ()[len] = 0; \ } // // Loop over all the lines of text and check for wrapping... // const WCHAR *line_start = renderer->Find_Row_Start (text, 0); while (line_start != NULL) { // // Lookup the start of the next line... // const WCHAR *line_end = renderer->Find_Row_Start (line_start, 1); // // Copy this line of text into the control // WideStringClass curr_text; COPY_LINE (curr_text, line_start, line_end); // // Render this row of text // Render_Text (curr_text, renderer, text_color, shadow_color, curr_rect, do_shadow, false, justify, false); // // Advance to the next line... // line_start = line_end; curr_rect.Top += text_height; } return ; } //////////////////////////////////////////////////////////////// // // Render_Wrapped_Text // //////////////////////////////////////////////////////////////// void StyleMgrClass::Render_Wrapped_Text ( const WCHAR * text, Render2DSentenceClass * renderer, uint32 text_color, uint32 shadow_color, const RectClass & rect, bool do_shadow, bool do_vcenter ) { // // Enable wrapping // renderer->Set_Wrapping_Width (rect.Width ()); renderer->Set_Clipping_Rect (rect); // // Assume left justification // int x_pos = rect.Left + 1; int y_pos = rect.Top + 1; // // Center the text vertically if necessary // if (do_vcenter) { Vector2 extents = renderer->Get_Formatted_Text_Extents (text); y_pos = rect.Top + (rect.Height () / 2.0F) - (extents.Y / 2.0F); } // // Build the textures for the text we'll be drawing // renderer->Build_Sentence (text); // // Render the shadow (if necessary) // if (do_shadow) { renderer->Set_Location (Vector2 (x_pos - 1, y_pos + 1)); renderer->Draw_Sentence (shadow_color); } // // Render the text // renderer->Set_Location (Vector2 (x_pos, y_pos)); renderer->Draw_Sentence (text_color); return ; } //////////////////////////////////////////////////////////////// // // Configure_Hilighter // //////////////////////////////////////////////////////////////// void StyleMgrClass::Configure_Hilighter (Render2DClass *renderer) { renderer->Enable_Alpha (false); renderer->Enable_Texturing (false); // // Setup an additive shader // ShaderClass *shader = renderer->Get_Shader (); shader->Set_Dst_Blend_Func (ShaderClass::DSTBLEND_ONE); shader->Set_Src_Blend_Func (ShaderClass::SRCBLEND_ONE); //shader->Set_Primary_Gradient (ShaderClass::GRADIENT_ADD); //shader->Set_Secondary_Gradient (ShaderClass::SECONDARY_GRADIENT_DISABLE); return ; } //////////////////////////////////////////////////////////////// // // Render_Hilight // //////////////////////////////////////////////////////////////// void StyleMgrClass::Render_Hilight (Render2DClass *renderer, const RectClass &rect) { renderer->Add_Quad (rect, HilightColor); return ; } //////////////////////////////////////////////////////////////// // // Render_Glow // //////////////////////////////////////////////////////////////// void StyleMgrClass::Render_Glow ( const WCHAR * text, Render2DSentenceClass * renderer, const RectClass & rect, int radius_x, int radius_y, int color, JUSTIFICATION justify ) { // // Get the extents of the text we will be drawing // Vector2 text_extent = renderer->Get_Text_Extents (text); // // Assume centered text // int x_pos = int(rect.Left + (rect.Width () / 2) - (text_extent.X / 2)); int y_pos = int(rect.Top + (rect.Height () / 2) - (text_extent.Y / 2)); if (justify == LEFT_JUSTIFY) { // // Caclulate left justification // x_pos = int(rect.Left + 1); } else if (justify == RIGHT_JUSTIFY) { // // Caclulate right justification // x_pos = int(rect.Right - text_extent.X); } // // Setup an additive shader // renderer->Make_Additive (); // // Figure out how many passes we should do to get the // desired result // float max_radius = max (radius_x, radius_y); int pass_count = 4;//max_radius / 3; //pass_count = min (pass_count, 5); //pass_count = max (pass_count, 3); int step_count = 7;//max_radius; //step_count = min (step_count, 10); //step_count = max (step_count, 4); float angle_inc = DEG_TO_RADF (360) / step_count; float x_inc = radius_x / pass_count; float y_inc = radius_y / pass_count; float curr_radiusx = 2.0F; float curr_radiusy = 2.0F; // // Do four passes to get from the inner radius to the outer radius // for (int pass_index = 0; pass_index < pass_count; pass_index ++) { // // Circle the characters around using the given radius // float angle = 0; for (int index = 0; index < step_count; index ++) { float new_x_pos = float(x_pos + (WWMath::Cos(angle) * curr_radiusx)); float new_y_pos = float(y_pos + (WWMath::Sin(angle) * curr_radiusy)); angle += angle_inc; // // Render the text // renderer->Set_Location (Vector2 (new_x_pos, new_y_pos)); renderer->Draw_Sentence (color); } curr_radiusx += x_inc; curr_radiusy += y_inc; } return ; } //////////////////////////////////////////////////////////////// // // Configure_Renderer // //////////////////////////////////////////////////////////////// void StyleMgrClass::Configure_Renderer (Render2DClass *renderer) { // // Set the coordinate range for the renderer // renderer->Set_Coordinate_Range (Render2DClass::Get_Screen_Resolution ()); // // Turn depth-buffer reading on for this renderer // //ShaderClass *shader = renderer->Get_Shader (); //shader->Set_Depth_Compare (ShaderClass::PASS_LEQUAL); return ; } //////////////////////////////////////////////////////////////// // // Play_Sound // //////////////////////////////////////////////////////////////// void StyleMgrClass::Play_Sound (EVENT_AUDIO event) { if ( WWAudioClass::Get_Instance () == NULL || EventAudioList[event].Get_Length () == 0) { return ; } // // Parse the information // StringClass tmp_copy (EventAudioList[event], true); StringClass filename = ::strtok (tmp_copy.Peek_Buffer (), ","); StringClass vol_string = ::strtok (NULL, ","); float volume = ::atoi (vol_string) / 100.0F; // // Play the sound effect // WWAudioClass::Get_Instance ()->Simple_Play_2D_Sound_Effect (filename, 1.0F, volume); return ; }