Implemented LessRoundBox custom font and FT2 extension font rendering. Enabled Emscripten compatible FT2 extension capabilities. Replaced original TTF PGEX with newline compatible version.
This commit is contained in:
		
							parent
							
								
									2af830d400
								
							
						
					
					
						commit
						f9b00a8931
					
				| @ -64,6 +64,7 @@ All rights reserved. | ||||
| #include "ItemDrop.h" | ||||
| #include "VisualNovel.h" | ||||
| #include "util.h" | ||||
| #include "olcPGEX_TTF.h" | ||||
| 
 | ||||
| INCLUDE_EMITTER_LIST | ||||
| 
 | ||||
| @ -137,6 +138,8 @@ Crawler::Crawler() | ||||
| } | ||||
| 
 | ||||
| bool Crawler::OnUserCreate(){ | ||||
| 	Font::init(); | ||||
| 
 | ||||
| 	InitializeDefaultKeybinds(); | ||||
| 
 | ||||
| 	VisualNovel::Initialize(); | ||||
|  | ||||
| @ -39,7 +39,7 @@ All rights reserved. | ||||
| #define VERSION_MAJOR 0 | ||||
| #define VERSION_MINOR 2 | ||||
| #define VERSION_PATCH 1 | ||||
| #define VERSION_BUILD 3260 | ||||
| #define VERSION_BUILD 3283 | ||||
| 
 | ||||
| #define stringify(a) stringify_(a) | ||||
| #define stringify_(a) #a | ||||
|  | ||||
| @ -50,8 +50,10 @@ INCLUDE_GFX | ||||
| VisualNovel VisualNovel::novel; | ||||
| safemap<std::string,std::vector<std::unique_ptr<Command>>>VisualNovel::storyLevelData; | ||||
| std::set<std::string>VisualNovel::graphicsToLoad; | ||||
| Font VisualNovel::font; | ||||
| 
 | ||||
| void VisualNovel::Initialize(){ | ||||
| 	font=Font("GFX_Prefix"_S+"dialog_font_size"_s[0]+".ttf","dialog_font_size"_i[1]); | ||||
| 	for(int chapter=1;chapter<=6;chapter++){ | ||||
| 		std::string chapterFilename="assets/"+"story_directory"_S+"Chapter "+std::to_string(chapter)+".txt"; | ||||
| 		std::ifstream file(chapterFilename); | ||||
| @ -167,7 +169,7 @@ void VisualNovel::Initialize(){ | ||||
| }; | ||||
| void VisualNovel::LoadVisualNovel(std::string storyLevelName){ | ||||
| 	novel.storyLevel=storyLevelName; | ||||
| 	novel.activeText=""; | ||||
| 	novel.activeText=U""; | ||||
| 	novel.leftCharacters.clear(); | ||||
| 	novel.rightCharacters.clear(); | ||||
| 	novel.backgroundFilename=""; | ||||
| @ -182,7 +184,7 @@ void VisualNovel::LoadVisualNovel(std::string storyLevelName){ | ||||
| } | ||||
| void VisualNovel::Update(){ | ||||
| 	if(transitionTime==0&&game->KEY_CONFIRM.Pressed()){ | ||||
| 		activeText=""; | ||||
| 		activeText=U""; | ||||
| 		novel.ExecuteNextCommand(); | ||||
| 	} | ||||
| 	locationDisplayTime=std::max(0.f,locationDisplayTime-game->GetElapsedTime()); | ||||
| @ -192,7 +194,7 @@ void VisualNovel::Update(){ | ||||
| void VisualNovel::ExecuteNextCommand(){ | ||||
| 	if(commandIndex<commands.size()){ | ||||
| 		commandIndex++; | ||||
| 		commands[commandIndex-1]->Execute(novel); | ||||
| 		commands[size_t(commandIndex-1)]->Execute(novel); | ||||
| 	}else{ | ||||
| 		Unlock::UnlockCurrentMap(); | ||||
| 		Menu::themeSelection=novel.prevTheme; | ||||
| @ -214,14 +216,14 @@ void VisualNovel::Draw(){ | ||||
| 	} | ||||
| 	for(int i=leftCharacters.size()-1;i>=0;i--){ | ||||
| 		//Start 72 from the bottom.
 | ||||
| 		std::string character=leftCharacters[i]; | ||||
| 		std::u32string character(leftCharacters[i].begin(),leftCharacters[i].end()); | ||||
| 		Pixel fadeColor=WHITE; | ||||
| 		if(character!=actualSpeakerName)fadeColor={128,128,128,255}; | ||||
| 		game->DrawDecal(vi2d{0,game->GetScreenSize().y}-vi2d{-i*64,72+168},GFX[GetCharacterImage(character)].Decal(),{1,1},fadeColor); | ||||
| 	} | ||||
| 	for(int i=rightCharacters.size()-1;i>=0;i--){ | ||||
| 		//Start 72 from the bottom.
 | ||||
| 		std::string character=rightCharacters[i]; | ||||
| 		std::u32string character(rightCharacters[i].begin(),rightCharacters[i].end()); | ||||
| 		Pixel fadeColor=WHITE; | ||||
| 		if(character!=actualSpeakerName)fadeColor={128,128,128,255}; | ||||
| 		float spriteWidth=GFX[GetCharacterImage(character)].Sprite()->width; | ||||
| @ -242,9 +244,9 @@ void VisualNovel::Draw(){ | ||||
| 		vf2d dialogDisplayPos={24.f,game->GetScreenSize().y-48.f}; | ||||
| 		vf2d dialogDisplaySize={game->GetScreenSize().x-48.f,20.f}; | ||||
| 		Menu::DrawThemedWindow(dialogDisplayPos,dialogDisplaySize); | ||||
| 		vf2d speakerTextSize=game->GetTextSizeProp(speakerDisplayName); | ||||
| 		game->DrawShadowStringPropDecal(nameDisplayPos-vf2d{10,8}+(nameDisplayWindowSize+vf2d{24,0})/2-speakerTextSize/2,speakerDisplayName); | ||||
| 		game->DrawShadowStringPropDecal(dialogDisplayPos-vf2d{10,10},activeText); | ||||
| 		FontRect speakerTextSize=font.GetStringBounds(speakerDisplayName); | ||||
| 		game->DrawShadowStringDecal(font,nameDisplayPos-vf2d{10,8}+(nameDisplayWindowSize+vf2d{24,0})/2-speakerTextSize.size/2,speakerDisplayName); | ||||
| 		game->DrawShadowStringDecal(font,dialogDisplayPos-vf2d{10,10},activeText); | ||||
| 		float yOffset=util::lerp(dialogDisplaySize.y+12,-8,textScrollTime/maxTextScrollTime); | ||||
| 		game->DrawPolygonDecal( | ||||
| 			Menu::GetPatchPart(1,1).Decal(), | ||||
| @ -253,11 +255,11 @@ void VisualNovel::Draw(){ | ||||
| 			{{255,255,255,240},{255,255,255,255},{255,255,255,255},{255,255,255,240}}); | ||||
| 	} | ||||
| } | ||||
| std::string VisualNovel::GetCharacterImage(std::string name){ | ||||
| 	if(name=="You"){ //Assume we are using female player avatar for now!
 | ||||
| std::string VisualNovel::GetCharacterImage(std::u32string name){ | ||||
| 	if(name==U"You"){ //Assume we are using female player avatar for now!
 | ||||
| 		return "character_image_location"_S+"Player_F.png"; | ||||
| 	} | ||||
| 	return "character_image_location"_S+name+".png"; | ||||
| 	return "character_image_location"_S+std::string(name.begin(),name.end())+".png"; | ||||
| } | ||||
| 
 | ||||
| VisualNovel::VisualNovel(){} | ||||
| @ -300,8 +302,8 @@ RightCommand::RightCommand(std::vector<std::string>characters) | ||||
| CommandType::CommandType RightCommand::GetType(){return CommandType::RIGHT;} | ||||
| 
 | ||||
| void SpeakerCommand::Execute(VisualNovel&vn){ | ||||
| 	vn.speakerDisplayName=displayedName; | ||||
| 	vn.actualSpeakerName=actualSpeakerName; | ||||
| 	vn.speakerDisplayName.assign(displayedName.begin(),displayedName.end()); | ||||
| 	vn.actualSpeakerName.assign(actualSpeakerName.begin(),actualSpeakerName.end()); | ||||
| 	vn.ExecuteNextCommand(); | ||||
| } | ||||
| SpeakerCommand::SpeakerCommand(std::string speaker) | ||||
| @ -313,8 +315,8 @@ CommandType::CommandType SpeakerCommand::GetType(){return CommandType::SPEAKER;} | ||||
| void DialogCommand::Execute(VisualNovel&vn){ | ||||
| 	vn.textScrollTime=VisualNovel::maxTextScrollTime; | ||||
| 	bool mustDisplay=vn.activeText.length()==0; | ||||
| 	std::string newText=util::WrapText(game,vn.activeText+(vn.activeText.length()>0?" ":"")+dialog,game->GetScreenSize().x-48,true,{1,1}); | ||||
| 	if(game->GetTextSizeProp(newText).y>40){//Hit the maximum of 3 lines.
 | ||||
| 	std::u32string newText=util::WrapText(game,vn.activeText+(vn.activeText.length()>0?U" ":U"")+std::u32string(dialog.begin(),dialog.end()),game->GetScreenSize().x-48,VisualNovel::font,{1,1}); | ||||
| 	if(VisualNovel::font.GetStringBounds(newText).size.y>40){//Hit the maximum of 3 lines.
 | ||||
| 		if(!mustDisplay){ | ||||
| 			vn.commandIndex--; | ||||
| 		} | ||||
|  | ||||
| @ -40,6 +40,7 @@ All rights reserved. | ||||
| #include <memory> | ||||
| #include "safemap.h" | ||||
| #include <set> | ||||
| #include "olcPGEX_TTF.h" | ||||
| 
 | ||||
| class VisualNovel; | ||||
| 
 | ||||
| @ -133,9 +134,9 @@ class VisualNovel{ | ||||
| 	friend class DialogCommand; | ||||
| 	friend class PauseCommand; | ||||
| 	std::string storyLevel; | ||||
| 	std::string speakerDisplayName=""; | ||||
| 	std::string	actualSpeakerName=""; | ||||
| 	std::string activeText; | ||||
| 	std::u32string speakerDisplayName=U""; | ||||
| 	std::u32string	actualSpeakerName=U""; | ||||
| 	std::u32string activeText; | ||||
| 	std::vector<std::string>leftCharacters; | ||||
| 	std::vector<std::string>rightCharacters; | ||||
| 	std::string backgroundFilename; | ||||
| @ -149,6 +150,7 @@ class VisualNovel{ | ||||
| 	std::string prevTheme=""; | ||||
| 	float textScrollTime=0; | ||||
| 	static constexpr float maxTextScrollTime=1.0f; | ||||
| 	static Font font; | ||||
| 
 | ||||
| 	static std::set<std::string>graphicsToLoad; | ||||
| 	static safemap<std::string,std::vector<std::unique_ptr<Command>>>storyLevelData; | ||||
| @ -163,5 +165,5 @@ public: | ||||
| 	void ExecuteNextCommand(); | ||||
| 	void Update(); | ||||
| 	void Draw(); | ||||
| 	std::string GetCharacterImage(std::string name); | ||||
| 	std::string GetCharacterImage(std::u32string name); | ||||
| }; | ||||
							
								
								
									
										
											BIN
										
									
								
								Crawler/assets/LessRoundBox.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Crawler/assets/LessRoundBox.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| @ -60,6 +60,9 @@ story_background_image_location = backgrounds/ | ||||
| # The name substituted for the player in dialogs | ||||
| story_player_name = You | ||||
| 
 | ||||
| # Dialog font and size. | ||||
| dialog_font_size = LessRoundBox,24 | ||||
| 
 | ||||
| # Whether or not to show individual data accesses from config data structure. | ||||
| debug_access_options = 0 | ||||
| 
 | ||||
|  | ||||
| @ -72,28 +72,8 @@ namespace olc { | ||||
| 
 | ||||
|         Font(std::string path, int fontSize) : fontSize(fontSize) { | ||||
|             FT_Error error = FT_New_Face(library, path.c_str(), 0, &fontFace); | ||||
|             if (error) { | ||||
|                 const char *errorString = FT_Error_String(error); | ||||
|                 if (errorString == nullptr) { | ||||
|                     std::cerr | ||||
|                         << "An unknown error occured while loading the font! Error code: " | ||||
|                         << error << "\n"; | ||||
|                 } else { | ||||
|                     std::cerr << errorString << "\n"; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             error = FT_Set_Pixel_Sizes(fontFace, 0, fontSize); | ||||
|             if (error) { | ||||
|                 const char *errorString = FT_Error_String(error); | ||||
|                 if (errorString == nullptr) { | ||||
|                     std::cerr | ||||
|                         << "An unknown error occured while loading the font!Error Code: " | ||||
|                         << error << "\n"; | ||||
|                 } else { | ||||
|                     std::cerr << errorString << "\n"; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         Font(const Font &other) = delete; | ||||
| @ -134,6 +114,8 @@ namespace olc { | ||||
| 
 | ||||
|             for (size_t i = 0; i < string.size(); i++) { | ||||
|                 char32_t chr = string[i]; | ||||
| 
 | ||||
| 
 | ||||
|                 Font *toUse = this; | ||||
|                 FT_UInt chrIndex = GetCharIndex(chr); | ||||
| 
 | ||||
| @ -159,26 +141,23 @@ namespace olc { | ||||
|                 FT_Set_Transform(toUse->fontFace, &rotMat, &pen); | ||||
|                 FT_Error error = FT_Load_Char(toUse->fontFace, chr, | ||||
|                     FT_LOAD_RENDER | FT_LOAD_COLOR); | ||||
|                 if (error) { | ||||
|                     const char *errorString = FT_Error_String(error); | ||||
|                     if (errorString == nullptr) { | ||||
|                         std::cerr | ||||
|                             << "An unknown error occured while rendering a glyph!  Error code: " | ||||
|                             << error << "\n"; | ||||
|                     } else { | ||||
|                         std::cerr << errorString << "\n"; | ||||
|                     } | ||||
|                     return; | ||||
|                 } | ||||
| 
 | ||||
|                 FT_Bitmap bmp = toUse->fontFace->glyph->bitmap; | ||||
|                 FT_GlyphSlot slot = toUse->fontFace->glyph; | ||||
|                 DrawBitmap(slot->bitmap_left, | ||||
|                     pge->ScreenHeight() - slot->bitmap_top, bmp, color); | ||||
| 
 | ||||
| 
 | ||||
|                 pen.x += toUse->fontFace->glyph->advance.x; | ||||
|                 pen.y += toUse->fontFace->glyph->advance.y; | ||||
| 
 | ||||
|                 if(chr=='\n'){ | ||||
|                     int scaled_line_spacing = fontFace->size->metrics.height; | ||||
|                     pen.y -=scaled_line_spacing; | ||||
|                     pen.x=x*64; | ||||
|                 } else { | ||||
|                     DrawBitmap(slot->bitmap_left, | ||||
|                         pge->ScreenHeight() - slot->bitmap_top, bmp, color); | ||||
|                 } | ||||
| 
 | ||||
|                 prevToUse = toUse; | ||||
|             } | ||||
| 
 | ||||
| @ -189,8 +168,8 @@ namespace olc { | ||||
|             olc::Pixel color = olc::BLACK, float angle = 0.0f) { | ||||
|             DrawString(string, pos.x, pos.y, color, angle); | ||||
|         } | ||||
| 
 | ||||
|         FontRect GetStringBounds(std::u32string string, float angle = 0.0f) { | ||||
|         private: | ||||
|         FontRect _GetStringBounds(std::u32string string, float angle = 0.0f) { | ||||
|             FT_Matrix rotMat; | ||||
|             rotMat.xx = (FT_Fixed)(std::cos(angle) * 0x10000L); | ||||
|             rotMat.xy = (FT_Fixed)(-std::sin(angle) * 0x10000L); | ||||
| @ -214,6 +193,7 @@ namespace olc { | ||||
| 
 | ||||
|             for (size_t i = 0; i < string.size(); i++) { | ||||
|                 char32_t chr = string[i]; | ||||
|                 if(chr=='\r')continue; | ||||
| 
 | ||||
|                 Font *toUse = this; | ||||
|                 FT_UInt chrIndex = GetCharIndex(chr); | ||||
| @ -238,19 +218,7 @@ namespace olc { | ||||
|                 } | ||||
| 
 | ||||
|                 FT_Set_Transform(toUse->fontFace, &rotMat, &pen); | ||||
|                 FT_Error error = FT_Load_Char(toUse->fontFace, chr, | ||||
|                     FT_LOAD_BITMAP_METRICS_ONLY); | ||||
|                 if (error) { | ||||
|                     const char *errorString = FT_Error_String(error); | ||||
|                     if (errorString == nullptr) { | ||||
|                         std::cerr | ||||
|                             << "An unknown error occured while loading a glyph!  Error code: " | ||||
|                             << error << "\n"; | ||||
|                     } else { | ||||
|                         std::cerr << errorString << "\n"; | ||||
|                     } | ||||
|                     return olc::FontRect{{0, 0}, {0, 0}}; | ||||
|                 } | ||||
|                 FT_Error error = FT_Load_Char(toUse->fontFace, chr, FT_LOAD_RENDER); | ||||
| 
 | ||||
|                 FT_GlyphSlot slot = toUse->fontFace->glyph; | ||||
|                 FT_Glyph glyph; | ||||
| @ -275,6 +243,11 @@ namespace olc { | ||||
|                 pen.x += slot->advance.x; | ||||
|                 pen.y += slot->advance.y; | ||||
| 
 | ||||
|                 if(chr=='\n'){ | ||||
|                     int scaled_line_spacing = fontFace->size->metrics.height; | ||||
|                     pen.y -=scaled_line_spacing; | ||||
|                     pen.x=minX; | ||||
|                 } | ||||
|                 FT_Done_Glyph(glyph); | ||||
|             } | ||||
| 
 | ||||
| @ -285,9 +258,15 @@ namespace olc { | ||||
|             return olc::FontRect{{minX, -maxY}, {maxX - minX, maxY - minY}}; | ||||
|         } | ||||
| 
 | ||||
|         public: | ||||
|         FontRect GetStringBounds(std::u32string string, float angle = 0.0f) { | ||||
|             FontRect temp=_GetStringBounds(string,angle); | ||||
|             return {temp.offset/2,{temp.size/2}}; | ||||
|         } | ||||
| 
 | ||||
|         olc::Sprite *RenderStringToSprite(std::u32string string, | ||||
|             olc::Pixel color) { | ||||
|             olc::FontRect rect = GetStringBounds(string); | ||||
|             olc::FontRect rect = _GetStringBounds(string); | ||||
|             olc::Sprite *sprite = new olc::Sprite{rect.size.x, rect.size.y}; | ||||
| 
 | ||||
|             for (int x = 0; x < rect.size.x; x++) { | ||||
| @ -307,7 +286,7 @@ namespace olc { | ||||
| 
 | ||||
|             for (size_t i = 0; i < string.size(); i++) { | ||||
|                 char32_t chr = string[i]; | ||||
| 
 | ||||
|                 if(chr=='\r')continue; | ||||
|                 Font *toUse = this; | ||||
|                 FT_UInt chrIndex = GetCharIndex(chr); | ||||
| 
 | ||||
| @ -333,26 +312,22 @@ namespace olc { | ||||
|                 FT_Set_Transform(toUse->fontFace, nullptr, &pen); | ||||
|                 FT_Error error = FT_Load_Char(toUse->fontFace, chr, | ||||
|                     FT_LOAD_RENDER | FT_LOAD_COLOR); | ||||
|                 if (error) { | ||||
|                     const char *errorString = FT_Error_String(error); | ||||
|                     if (errorString == nullptr) { | ||||
|                         std::cerr | ||||
|                             << "An unknown error occured while rendering a glyph!  Error code: " | ||||
|                             << error << "\n"; | ||||
|                     } else { | ||||
|                         std::cerr << errorString << "\n"; | ||||
|                     } | ||||
|                     return nullptr; | ||||
|                 } | ||||
| 
 | ||||
|                 FT_Bitmap bmp = toUse->fontFace->glyph->bitmap; | ||||
|                 FT_GlyphSlot slot = toUse->fontFace->glyph; | ||||
|                 DrawBitmapTo(slot->bitmap_left, | ||||
|                     pge->ScreenHeight() - slot->bitmap_top, bmp, color, | ||||
|                     sprite); | ||||
| 
 | ||||
|                 pen.x += toUse->fontFace->glyph->advance.x; | ||||
|                 pen.y += toUse->fontFace->glyph->advance.y; | ||||
| 
 | ||||
|                 if(chr=='\n'){ | ||||
|                     int scaled_line_spacing = fontFace->size->metrics.height; | ||||
|                     pen.y -=scaled_line_spacing; | ||||
|                     pen.x=rect.offset.x; | ||||
|                 } else { | ||||
|                     DrawBitmapTo(slot->bitmap_left, | ||||
|                         pge->ScreenHeight() - slot->bitmap_top, bmp, color, | ||||
|                         sprite); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             pge->SetPixelMode(prevMode); | ||||
| @ -393,19 +368,6 @@ namespace olc { | ||||
|         static bool init() { | ||||
|             FT_Error error = FT_Init_FreeType(&library); | ||||
| 
 | ||||
|             if (error) { | ||||
|                 const char *errorString = FT_Error_String(error); | ||||
|                 if (errorString == nullptr) { | ||||
|                     std::cerr | ||||
|                         << "An unknown error occured while loading the font library! " | ||||
|                         "Error code: " | ||||
|                         << error << "\n"; | ||||
|                 } else { | ||||
|                     std::cerr << errorString << "\n"; | ||||
|                 } | ||||
| 
 | ||||
|                 return false; | ||||
|             } | ||||
|             return true; | ||||
|         } | ||||
| 
 | ||||
| @ -431,7 +393,7 @@ namespace olc { | ||||
|                         if (byte == 0) { | ||||
|                             continue; | ||||
|                         } | ||||
|                         color.a = byte; | ||||
|                         color.a = 255; | ||||
|                         pge->Draw(x + bx, y + by, color); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
| @ -571,6 +571,7 @@ namespace olc | ||||
| { | ||||
| 	class PixelGameEngine; | ||||
| 	class Sprite; | ||||
| 	class Font; | ||||
| 
 | ||||
| 	// Pixel Game Engine Advanced Configuration
 | ||||
| 	constexpr inline uint8_t  nMouseButtons = 5; | ||||
| @ -1140,9 +1141,11 @@ namespace olc | ||||
| 		void DrawPartialRotatedDecal(const olc::vf2d& pos, olc::Decal* decal, const float fAngle, const olc::vf2d& center, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale = { 1.0f, 1.0f }, const olc::Pixel& tint = olc::WHITE); | ||||
| 		// Draws a multiline string as a decal, with tiniting and scaling
 | ||||
| 		void DrawStringDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); | ||||
| 		void DrawStringDecal(Font&font, const olc::vf2d& pos, const std::u32string& sText, const Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); | ||||
| 		void DrawStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); | ||||
| 		void DrawShadowStringDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col = olc::WHITE, const Pixel shadowCol = olc::BLACK, const olc::vf2d& scale = { 1.0f, 1.0f },const float shadowSizeFactor=1); | ||||
| 		void DrawShadowStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col = olc::WHITE, const Pixel shadowCol = olc::BLACK, const olc::vf2d& scale = { 1.0f, 1.0f },const float shadowSizeFactor=1); | ||||
| 		void DrawShadowStringDecal(Font&font, const olc::vf2d& pos, const std::u32string& sText, const Pixel col = olc::WHITE, const Pixel shadowCol = olc::BLACK, const olc::vf2d& scale = { 1.0f, 1.0f },const float shadowSizeFactor=1); | ||||
| 		// Draws a single shaded filled rectangle as a decal
 | ||||
| 		void DrawRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col = olc::WHITE); | ||||
| 		void FillRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col = olc::WHITE); | ||||
| @ -1465,7 +1468,7 @@ namespace olc | ||||
|   // O------------------------------------------------------------------------------O
 | ||||
| #ifdef OLC_PGE_APPLICATION | ||||
| #undef OLC_PGE_APPLICATION | ||||
| 
 | ||||
| #include "olcPGEX_TTF.h" | ||||
|   // O------------------------------------------------------------------------------O
 | ||||
|   // | olcPixelGameEngine INTERFACE IMPLEMENTATION (CORE)                           |
 | ||||
|   // | Note: The core implementation is platform independent                        |
 | ||||
| @ -3281,6 +3284,7 @@ namespace olc | ||||
| 		olc::vf2d spos = { 0.0f, 0.0f }; | ||||
| 		for (auto c : sText) | ||||
| 		{ | ||||
| 			if(c=='\r')continue; //Ignore carriage returns. Stupid Linux.
 | ||||
| 			if (c == '\n') | ||||
| 			{ | ||||
| 				spos.x = 0; spos.y += 8.0f * scale.y; | ||||
| @ -3304,6 +3308,7 @@ namespace olc | ||||
| 		olc::vf2d spos = { 0.0f, 0.0f }; | ||||
| 		for (auto c : sText) | ||||
| 		{ | ||||
| 			if(c=='\r')continue; //Ignore carriage returns. Stupid Linux.
 | ||||
| 			if (c == '\n') | ||||
| 			{ | ||||
| 				spos.x = 0; spos.y += 8.0f * scale.y; | ||||
| @ -3333,6 +3338,33 @@ namespace olc | ||||
| 		DrawStringDecal(pos, sText, col,scale); | ||||
| 	} | ||||
| 
 | ||||
| 	void PixelGameEngine::DrawStringDecal(Font&font, const olc::vf2d& pos, const std::u32string& sText, const Pixel col, const olc::vf2d& scale){ | ||||
| 		if(sText.length()==0)return; | ||||
| 		static Decal*temp=nullptr; | ||||
| 		if(temp!=nullptr){ | ||||
| 			delete temp; | ||||
| 		} | ||||
| 		temp=font.RenderStringToDecal(sText,col); | ||||
| 		DrawDecal(pos,temp,scale/2,col); | ||||
| 	} | ||||
| 
 | ||||
| 	void PixelGameEngine::DrawShadowStringDecal(Font&font, const olc::vf2d& pos, const std::u32string& sText, const Pixel col, const Pixel shadowCol, const olc::vf2d& scale,const float shadowSizeFactor){ | ||||
| 		if(sText.length()==0)return; | ||||
| 		static Decal*temp=nullptr; | ||||
| 		if(temp!=nullptr){ | ||||
| 			delete temp; | ||||
| 		} | ||||
| 		temp=font.RenderStringToDecal(sText,col); | ||||
| 		for(float y=-shadowSizeFactor;y<=shadowSizeFactor+0.1;y+=shadowSizeFactor/2){ | ||||
| 			for(float x=-shadowSizeFactor;x<=shadowSizeFactor+0.1;x+=shadowSizeFactor/2){ | ||||
| 				if(x!=0||y!=0){ | ||||
| 					DrawDecal(pos+vf2d{x,y},temp,scale/2,shadowCol); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		DrawDecal(pos,temp,scale/2,col); | ||||
| 	} | ||||
| 
 | ||||
| 	void PixelGameEngine::DrawShadowStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col, const Pixel shadowCol, const olc::vf2d& scale,const float shadowSizeFactor){ | ||||
| 		for(float y=-shadowSizeFactor;y<=shadowSizeFactor+0.1;y+=shadowSizeFactor/2){ | ||||
| 			for(float x=-shadowSizeFactor;x<=shadowSizeFactor+0.1;x+=shadowSizeFactor/2){ | ||||
| @ -3440,6 +3472,7 @@ namespace olc | ||||
| 		olc::vi2d pos = { 0,1 }; | ||||
| 		for (auto c : s) | ||||
| 		{ | ||||
| 			if(c=='\r')continue; //Ignore carriage returns. Stupid Linux.
 | ||||
| 			if (c == '\n') { pos.y++;  pos.x = 0; } | ||||
| 			else if (c == '\t') { pos.x += nTabSizeInSpaces; } | ||||
| 			else pos.x++; | ||||
| @ -3465,6 +3498,7 @@ namespace olc | ||||
| 		} | ||||
| 		for (auto c : sText) | ||||
| 		{ | ||||
| 			if(c=='\r')continue; //Ignore carriage returns. Stupid Linux.
 | ||||
| 			if (c == '\n') | ||||
| 			{ | ||||
| 				sx = 0; sy += 8 * scale; | ||||
| @ -3506,6 +3540,7 @@ namespace olc | ||||
| 		olc::vi2d pos = { 0,1 }; | ||||
| 		for (auto c : s) | ||||
| 		{ | ||||
| 			if(c=='\r')continue; //Ignore carriage returns. Stupid Linux.
 | ||||
| 			if (c == '\n') { pos.y += 1;  pos.x = 0; } | ||||
| 			else if (c == '\t') { pos.x += nTabSizeInSpaces * 8; } | ||||
| 			else pos.x += vFontSpacing[c - 32].y; | ||||
| @ -3533,6 +3568,7 @@ namespace olc | ||||
| 		} | ||||
| 		for (auto c : sText) | ||||
| 		{ | ||||
| 			if(c=='\r')continue; //Ignore carriage returns. Stupid Linux.
 | ||||
| 			if (c == '\n') | ||||
| 			{ | ||||
| 				sx = 0; sy += 8 * scale; | ||||
|  | ||||
							
								
								
									
										
											BIN
										
									
								
								Crawler/pge.data
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Crawler/pge.data
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 8.4 MiB After Width: | Height: | Size: 9.2 MiB | 
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								Crawler/pge.wasm
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Crawler/pge.wasm
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| @ -37,6 +37,8 @@ All rights reserved. | ||||
| #pragma endregion | ||||
| #define _CRTDBG_MAP_ALLOC | ||||
| //#define OLC_PGE_HEADLESS
 | ||||
| #define OLC_PGEX_TTF | ||||
| #include "olcPGEX_TTF.h" | ||||
| #define OLC_PGE_APPLICATION | ||||
| #include "olcPixelGameEngine.h" | ||||
| #define OLC_PGEX_TRANSFORMEDVIEW | ||||
|  | ||||
| @ -37,6 +37,7 @@ All rights reserved. | ||||
| #pragma endregion | ||||
| #include "util.h" | ||||
| #include "olcPixelGameEngine.h" | ||||
| #include "olcPGEX_TTF.h" | ||||
| 
 | ||||
| float util::random(float range){ | ||||
| 	return float(rand())/RAND_MAX*range; | ||||
| @ -83,25 +84,49 @@ std::string util::timerStr(float time){ | ||||
| } | ||||
| 
 | ||||
| std::string util::WrapText(PixelGameEngine*pge,std::string str,int width,bool proportional,vd2d scale){ | ||||
| 	std::string newStr; | ||||
| 	while (true) { | ||||
| 		std::string word; | ||||
| 		if (str.find(" ")==std::string::npos) { | ||||
| 	std::string newStr=""; | ||||
| 	while(true){ | ||||
| 		std::string word=""; | ||||
| 		if(str.find(" ")==std::string::npos){ | ||||
| 			word=str; | ||||
| 		} else { | ||||
| 			word = str.substr(0,str.find(" ")); | ||||
| 		}else{ | ||||
| 			word=str.substr(0,str.find(" ")); | ||||
| 		} | ||||
| 		vi2d newSize = vd2d(proportional?pge->GetTextSizeProp(newStr+(newStr.size()>0?" ":"")+word):pge->GetTextSize(newStr+(newStr.size()>0?" ":"")+word))*scale; | ||||
| 		if (newSize.x>width) { | ||||
| 		if(newSize.x>width){ | ||||
| 			newStr+="\n"+word; | ||||
| 		} else { | ||||
| 		}else{ | ||||
| 			newStr+=(newStr.size()>0?" ":"")+word; | ||||
| 		} | ||||
| 		if (str.find(" ")==std::string::npos) { | ||||
| 		if(str.find(" ")==std::string::npos){ | ||||
| 			break; | ||||
| 		} else { | ||||
| 		}else{ | ||||
| 			str.erase(0,str.find(" ")+1); | ||||
| 		} | ||||
| 	} | ||||
| 	return newStr; | ||||
| } | ||||
| 
 | ||||
| std::u32string util::WrapText(PixelGameEngine*pge,std::u32string str,int width,Font&font,vd2d scale){ | ||||
| 	std::u32string newStr=U""; | ||||
| 	while(true){ | ||||
| 		std::u32string word=U""; | ||||
| 		if(str.find(U" ")==std::u32string::npos){ | ||||
| 			word=str; | ||||
| 		}else{ | ||||
| 			word=str.substr(0,str.find(U" ")); | ||||
| 		} | ||||
| 		FontRect newSize = font.GetStringBounds(newStr+(newStr.size()>0?U" ":U"")+word); | ||||
| 		if(newSize.size.x>width){ | ||||
| 			newStr+=U"\n"+word; | ||||
| 		}else{ | ||||
| 			newStr+=(newStr.size()>0?U" ":U"")+word; | ||||
| 		} | ||||
| 		if(str.find(U" ")==std::u32string::npos){ | ||||
| 			break; | ||||
| 		}else{ | ||||
| 			str.erase(0,str.find(U" ")+1); | ||||
| 		} | ||||
| 	} | ||||
| 	return newStr; | ||||
| } | ||||
| @ -38,6 +38,12 @@ All rights reserved. | ||||
| #pragma once | ||||
| #include <stdlib.h> | ||||
| #include "olcUTIL_Geometry2D.h" | ||||
| #if defined(__EMSCRIPTEN__) | ||||
| 	#include "olcPGEX_TTF.h" | ||||
| #else | ||||
| 	class olc::Font; | ||||
| #endif | ||||
| 
 | ||||
| namespace util{ | ||||
| 	//Returns 0-range (as a float).
 | ||||
| 	float random(float range); | ||||
| @ -50,4 +56,5 @@ namespace util{ | ||||
| 	float lerp(float n1,float n2,double t); | ||||
| 	std::string timerStr(float time); | ||||
| 	std::string WrapText(PixelGameEngine*pge,std::string str,int width,bool proportional,vd2d scale); | ||||
| 	std::u32string WrapText(PixelGameEngine*pge,std::u32string str,int width,Font&font,vd2d scale); | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user