Merge branch 'ios-rebase' into ios-support

This commit is contained in:
2026-04-06 14:51:52 -04:00
58 changed files with 2741 additions and 1367 deletions

View File

@@ -166,6 +166,7 @@ file(GLOB SERVER_SOURCES
"src/util/Mth.cpp" "src/util/Mth.cpp"
"src/util/PerfTimer.cpp" "src/util/PerfTimer.cpp"
"src/util/StringUtils.cpp" "src/util/StringUtils.cpp"
"src/util/Color.cpp"
"src/world/Direction.cpp" "src/world/Direction.cpp"
@@ -199,6 +200,9 @@ file(GLOB SERVER_SOURCES
"src/world/level/dimension/Dimension.cpp" "src/world/level/dimension/Dimension.cpp"
"src/world/level/dimension/FoliageColor.cpp"
"src/world/level/GrassColor.cpp"
"src/world/level/levelgen/*.cpp" "src/world/level/levelgen/*.cpp"
"src/world/level/levelgen/feature/Feature.cpp" "src/world/level/levelgen/feature/Feature.cpp"
"src/world/level/levelgen/synth/*.cpp" "src/world/level/levelgen/synth/*.cpp"
@@ -258,6 +262,8 @@ file(GLOB CLIENT_SOURCES
"src/util/**.cpp" "src/util/**.cpp"
"src/util/Color.cpp"
"src/world/*.cpp" "src/world/*.cpp"
"src/world/phys/*.cpp" "src/world/phys/*.cpp"
"src/world/entity/*.cpp" "src/world/entity/*.cpp"

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
data/images/misc/shadow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 868 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -153,6 +153,7 @@ options.group.tweaks=Tweaks
options.allowSprint=Allow sprint options.allowSprint=Allow sprint
options.barOnTop=HUD above inventory options.barOnTop=HUD above inventory
options.rpiCursor=Show Raspberry PI cursor options.rpiCursor=Show Raspberry PI cursor
options.foliageTint=Tint Grass and Leaves
options.autoJump=Auto Jump options.autoJump=Auto Jump
options.thirdperson=Third Person options.thirdperson=Third Person
options.servervisible=Server Visible options.servervisible=Server Visible

View File

@@ -146,6 +146,7 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
../../../src/util/StringUtils.cpp \ ../../../src/util/StringUtils.cpp \
../../../src/util/PerfTimer.cpp \ ../../../src/util/PerfTimer.cpp \
../../../src/util/PerfRenderer.cpp \ ../../../src/util/PerfRenderer.cpp \
../../../src/util/Color.cpp \
../../../src/world/Direction.cpp \ ../../../src/world/Direction.cpp \
../../../src/world/entity/AgableMob.cpp \ ../../../src/world/entity/AgableMob.cpp \
../../../src/world/entity/Entity.cpp \ ../../../src/world/entity/Entity.cpp \
@@ -209,6 +210,8 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
../../../src/world/level/MobSpawner.cpp \ ../../../src/world/level/MobSpawner.cpp \
../../../src/world/level/Region.cpp \ ../../../src/world/level/Region.cpp \
../../../src/world/level/TickNextTickData.cpp \ ../../../src/world/level/TickNextTickData.cpp \
../../../src/world/level/FoliageColor.cpp \
../../../src/world/level/GrassColor.cpp \
../../../src/world/level/biome/Biome.cpp \ ../../../src/world/level/biome/Biome.cpp \
../../../src/world/level/biome/BiomeSource.cpp \ ../../../src/world/level/biome/BiomeSource.cpp \
../../../src/world/level/chunk/LevelChunk.cpp \ ../../../src/world/level/chunk/LevelChunk.cpp \

View File

@@ -122,6 +122,7 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
../../../src/util/StringUtils.cpp \ ../../../src/util/StringUtils.cpp \
../../../src/util/PerfTimer.cpp \ ../../../src/util/PerfTimer.cpp \
../../../src/util/PerfRenderer.cpp \ ../../../src/util/PerfRenderer.cpp \
../../../src/util/Color.cpp \
../../../src/world/Direction.cpp \ ../../../src/world/Direction.cpp \
../../../src/world/entity/AgableMob.cpp \ ../../../src/world/entity/AgableMob.cpp \
../../../src/world/entity/Entity.cpp \ ../../../src/world/entity/Entity.cpp \
@@ -183,6 +184,8 @@ LOCAL_SRC_FILES := ../../../src/main.cpp \
../../../src/world/level/MobSpawner.cpp \ ../../../src/world/level/MobSpawner.cpp \
../../../src/world/level/Region.cpp \ ../../../src/world/level/Region.cpp \
../../../src/world/level/TickNextTickData.cpp \ ../../../src/world/level/TickNextTickData.cpp \
../../../src/world/level/FoliageColor.cpp \
../../../src/world/level/GrassColor.cpp \
../../../src/world/level/biome/Biome.cpp \ ../../../src/world/level/biome/Biome.cpp \
../../../src/world/level/biome/BiomeSource.cpp \ ../../../src/world/level/biome/BiomeSource.cpp \
../../../src/world/level/chunk/LevelChunk.cpp \ ../../../src/world/level/chunk/LevelChunk.cpp \

View File

@@ -1173,6 +1173,12 @@
F99D344C2F7370CF00DC153E /* Slider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D344A2F7370CF00DC153E /* Slider.cpp */; }; F99D344C2F7370CF00DC153E /* Slider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99D344A2F7370CF00DC153E /* Slider.cpp */; };
F99D344E2F7372A100DC153E /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F99D344D2F7372A100DC153E /* Launch Screen.storyboard */; }; F99D344E2F7372A100DC153E /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F99D344D2F7372A100DC153E /* Launch Screen.storyboard */; };
F99D344F2F7372A100DC153E /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F99D344D2F7372A100DC153E /* Launch Screen.storyboard */; }; F99D344F2F7372A100DC153E /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F99D344D2F7372A100DC153E /* Launch Screen.storyboard */; };
F99F0FA92F84369F00F2B29A /* GrassColor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99F0FA82F84369F00F2B29A /* GrassColor.cpp */; };
F99F0FAA2F84369F00F2B29A /* GrassColor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99F0FA82F84369F00F2B29A /* GrassColor.cpp */; };
F99F0FAC2F8436CE00F2B29A /* FoliageColor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99F0FAB2F8436CE00F2B29A /* FoliageColor.cpp */; };
F99F0FAD2F8436CE00F2B29A /* FoliageColor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99F0FAB2F8436CE00F2B29A /* FoliageColor.cpp */; };
F99F0FAF2F8436EB00F2B29A /* Color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99F0FAE2F8436EB00F2B29A /* Color.cpp */; };
F99F0FB02F8436EB00F2B29A /* Color.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F99F0FAE2F8436EB00F2B29A /* Color.cpp */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
@@ -2435,8 +2441,13 @@
F99D341D2F736AA100DC153E /* HttpClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HttpClient.h; path = ../../src/platform/HttpClient.h; sourceTree = "<group>"; }; F99D341D2F736AA100DC153E /* HttpClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = HttpClient.h; path = ../../src/platform/HttpClient.h; sourceTree = "<group>"; };
F99D341E2F736AA100DC153E /* HttpClient.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HttpClient.cpp; path = ../../src/platform/HttpClient.cpp; sourceTree = "<group>"; }; F99D341E2F736AA100DC153E /* HttpClient.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = HttpClient.cpp; path = ../../src/platform/HttpClient.cpp; sourceTree = "<group>"; };
F99D34212F736AD400DC153E /* TextOption.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TextOption.h; path = ../../src/client/gui/components/TextOption.h; sourceTree = "<group>"; }; F99D34212F736AD400DC153E /* TextOption.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TextOption.h; path = ../../src/client/gui/components/TextOption.h; sourceTree = "<group>"; };
<<<<<<< HEAD
F99D34222F736AD400DC153E /* TextOption.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = TextOption.cpp; path = ../../src/client/gui/components/TextOption.cpp; }; F99D34222F736AD400DC153E /* TextOption.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = TextOption.cpp; path = ../../src/client/gui/components/TextOption.cpp; };
F99D34252F736AFB00DC153E /* OptionsFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OptionsFile.h; path = ../../src/client/OptionsFile.h; sourceTree = "<group>"; sourceTree = "<group>"; }; F99D34252F736AFB00DC153E /* OptionsFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OptionsFile.h; path = ../../src/client/OptionsFile.h; sourceTree = "<group>"; sourceTree = "<group>"; };
=======
F99D34222F736AD400DC153E /* TextOption.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = TextOption.cpp; path = ../../src/client/gui/components/TextOption.cpp; sourceTree = "<unknown>"; };
F99D34252F736AFB00DC153E /* OptionsFile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OptionsFile.h; path = ../../src/client/OptionsFile.h; sourceTree = "<group>"; };
>>>>>>> ios-rebase
F99D34262F736AFB00DC153E /* OptionsFile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OptionsFile.cpp; path = ../../src/client/OptionsFile.cpp; sourceTree = "<group>"; }; F99D34262F736AFB00DC153E /* OptionsFile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OptionsFile.cpp; path = ../../src/client/OptionsFile.cpp; sourceTree = "<group>"; };
F99D34292F736B6F00DC153E /* OptionsItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OptionsItem.h; path = ../../src/client/gui/components/OptionsItem.h; sourceTree = "<group>"; }; F99D34292F736B6F00DC153E /* OptionsItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = OptionsItem.h; path = ../../src/client/gui/components/OptionsItem.h; sourceTree = "<group>"; };
F99D342A2F736B6F00DC153E /* OptionsItem.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OptionsItem.cpp; path = ../../src/client/gui/components/OptionsItem.cpp; sourceTree = "<group>"; }; F99D342A2F736B6F00DC153E /* OptionsItem.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = OptionsItem.cpp; path = ../../src/client/gui/components/OptionsItem.cpp; sourceTree = "<group>"; };
@@ -2457,6 +2468,12 @@
F99D34492F7370CF00DC153E /* Slider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Slider.h; path = ../../src/client/gui/components/Slider.h; sourceTree = "<group>"; }; F99D34492F7370CF00DC153E /* Slider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Slider.h; path = ../../src/client/gui/components/Slider.h; sourceTree = "<group>"; };
F99D344A2F7370CF00DC153E /* Slider.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Slider.cpp; path = ../../src/client/gui/components/Slider.cpp; sourceTree = "<group>"; }; F99D344A2F7370CF00DC153E /* Slider.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Slider.cpp; path = ../../src/client/gui/components/Slider.cpp; sourceTree = "<group>"; };
F99D344D2F7372A100DC153E /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = "<group>"; }; F99D344D2F7372A100DC153E /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = "<group>"; };
<<<<<<< HEAD
=======
F99F0FA82F84369F00F2B29A /* GrassColor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = GrassColor.cpp; sourceTree = "<group>"; };
F99F0FAB2F8436CE00F2B29A /* FoliageColor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FoliageColor.cpp; sourceTree = "<group>"; };
F99F0FAE2F8436EB00F2B29A /* Color.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Color.cpp; sourceTree = "<group>"; };
>>>>>>> ios-rebase
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@@ -3761,6 +3778,7 @@
D5B50E6914CFF66F005F7284 /* StringUtils.cpp */, D5B50E6914CFF66F005F7284 /* StringUtils.cpp */,
D5B50E6A14CFF66F005F7284 /* StringUtils.h */, D5B50E6A14CFF66F005F7284 /* StringUtils.h */,
D5B50E6B14CFF66F005F7284 /* WeighedRandom.h */, D5B50E6B14CFF66F005F7284 /* WeighedRandom.h */,
F99F0FAE2F8436EB00F2B29A /* Color.cpp */,
); );
path = util; path = util;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -4025,6 +4043,8 @@
D5B50F3714CFF66F005F7284 /* TickNextTickData.h */, D5B50F3714CFF66F005F7284 /* TickNextTickData.h */,
D5B50F3814CFF66F005F7284 /* tile */, D5B50F3814CFF66F005F7284 /* tile */,
D5B50F6814CFF66F005F7284 /* TilePos.h */, D5B50F6814CFF66F005F7284 /* TilePos.h */,
F99F0FA82F84369F00F2B29A /* GrassColor.cpp */,
F99F0FAB2F8436CE00F2B29A /* FoliageColor.cpp */,
); );
path = level; path = level;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -5194,6 +5214,7 @@
D5B5111014CFF670005F7284 /* Mth.cpp in Sources */, D5B5111014CFF670005F7284 /* Mth.cpp in Sources */,
D5B5111214CFF670005F7284 /* PerfRenderer.cpp in Sources */, D5B5111214CFF670005F7284 /* PerfRenderer.cpp in Sources */,
D5B5111414CFF670005F7284 /* PerfTimer.cpp in Sources */, D5B5111414CFF670005F7284 /* PerfTimer.cpp in Sources */,
F99F0FA92F84369F00F2B29A /* GrassColor.cpp in Sources */,
D5B5111614CFF670005F7284 /* StringUtils.cpp in Sources */, D5B5111614CFF670005F7284 /* StringUtils.cpp in Sources */,
D5B5111814CFF670005F7284 /* Direction.cpp in Sources */, D5B5111814CFF670005F7284 /* Direction.cpp in Sources */,
D5B5111A14CFF670005F7284 /* Animal.cpp in Sources */, D5B5111A14CFF670005F7284 /* Animal.cpp in Sources */,
@@ -5214,12 +5235,14 @@
D5B5113814CFF670005F7284 /* PathFinderMob.cpp in Sources */, D5B5113814CFF670005F7284 /* PathFinderMob.cpp in Sources */,
D5B5113A14CFF670005F7284 /* Inventory.cpp in Sources */, D5B5113A14CFF670005F7284 /* Inventory.cpp in Sources */,
D5B5113C14CFF670005F7284 /* Player.cpp in Sources */, D5B5113C14CFF670005F7284 /* Player.cpp in Sources */,
F99F0FB02F8436EB00F2B29A /* Color.cpp in Sources */,
D5B5113E14CFF670005F7284 /* Arrow.cpp in Sources */, D5B5113E14CFF670005F7284 /* Arrow.cpp in Sources */,
D5B5114014CFF670005F7284 /* Recipes.cpp in Sources */, D5B5114014CFF670005F7284 /* Recipes.cpp in Sources */,
D5B5114214CFF670005F7284 /* ToolRecipes.cpp in Sources */, D5B5114214CFF670005F7284 /* ToolRecipes.cpp in Sources */,
D5B5114414CFF670005F7284 /* WeaponRecipes.cpp in Sources */, D5B5114414CFF670005F7284 /* WeaponRecipes.cpp in Sources */,
D5B5114614CFF670005F7284 /* HatchetItem.cpp in Sources */, D5B5114614CFF670005F7284 /* HatchetItem.cpp in Sources */,
D5B5114814CFF670005F7284 /* Item.cpp in Sources */, D5B5114814CFF670005F7284 /* Item.cpp in Sources */,
F99F0FAC2F8436CE00F2B29A /* FoliageColor.cpp in Sources */,
D5B5114A14CFF670005F7284 /* ItemInstance.cpp in Sources */, D5B5114A14CFF670005F7284 /* ItemInstance.cpp in Sources */,
D5B5114C14CFF670005F7284 /* PickaxeItem.cpp in Sources */, D5B5114C14CFF670005F7284 /* PickaxeItem.cpp in Sources */,
F99D344B2F7370CF00DC153E /* Slider.cpp in Sources */, F99D344B2F7370CF00DC153E /* Slider.cpp in Sources */,
@@ -5528,6 +5551,7 @@
D5B5102F14CFF670005F7284 /* main.cpp in Sources */, D5B5102F14CFF670005F7284 /* main.cpp in Sources */,
D5B5103514CFF670005F7284 /* Tag.cpp in Sources */, D5B5103514CFF670005F7284 /* Tag.cpp in Sources */,
D5B5103714CFF670005F7284 /* ClientSideNetworkHandler.cpp in Sources */, D5B5103714CFF670005F7284 /* ClientSideNetworkHandler.cpp in Sources */,
F99F0FAF2F8436EB00F2B29A /* Color.cpp in Sources */,
D5B5103914CFF670005F7284 /* NetEventCallback.cpp in Sources */, D5B5103914CFF670005F7284 /* NetEventCallback.cpp in Sources */,
D5B5103B14CFF670005F7284 /* Packet.cpp in Sources */, D5B5103B14CFF670005F7284 /* Packet.cpp in Sources */,
D5B5103D14CFF670005F7284 /* RakNetInstance.cpp in Sources */, D5B5103D14CFF670005F7284 /* RakNetInstance.cpp in Sources */,
@@ -5548,6 +5572,7 @@
D5B5111514CFF670005F7284 /* StringUtils.cpp in Sources */, D5B5111514CFF670005F7284 /* StringUtils.cpp in Sources */,
D5B5111714CFF670005F7284 /* Direction.cpp in Sources */, D5B5111714CFF670005F7284 /* Direction.cpp in Sources */,
D5B5111914CFF670005F7284 /* Animal.cpp in Sources */, D5B5111914CFF670005F7284 /* Animal.cpp in Sources */,
F99F0FAD2F8436CE00F2B29A /* FoliageColor.cpp in Sources */,
D5B5111B14CFF670005F7284 /* Chicken.cpp in Sources */, D5B5111B14CFF670005F7284 /* Chicken.cpp in Sources */,
D5B5111D14CFF670005F7284 /* Cow.cpp in Sources */, D5B5111D14CFF670005F7284 /* Cow.cpp in Sources */,
D5B5111F14CFF670005F7284 /* Pig.cpp in Sources */, D5B5111F14CFF670005F7284 /* Pig.cpp in Sources */,
@@ -5598,6 +5623,7 @@
D5B5117714CFF670005F7284 /* ExternalFileLevelStorageSource.cpp in Sources */, D5B5117714CFF670005F7284 /* ExternalFileLevelStorageSource.cpp in Sources */,
D5B5117914CFF670005F7284 /* RegionFile.cpp in Sources */, D5B5117914CFF670005F7284 /* RegionFile.cpp in Sources */,
D5B5117B14CFF670005F7284 /* TickNextTickData.cpp in Sources */, D5B5117B14CFF670005F7284 /* TickNextTickData.cpp in Sources */,
F99F0FAA2F84369F00F2B29A /* GrassColor.cpp in Sources */,
D5B5117D14CFF670005F7284 /* DoorTile.cpp in Sources */, D5B5117D14CFF670005F7284 /* DoorTile.cpp in Sources */,
D5B5118114CFF670005F7284 /* StoneSlabTile.cpp in Sources */, D5B5118114CFF670005F7284 /* StoneSlabTile.cpp in Sources */,
D5B5118314CFF670005F7284 /* Tile.cpp in Sources */, D5B5118314CFF670005F7284 /* Tile.cpp in Sources */,
@@ -5853,7 +5879,11 @@
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src"; HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
<<<<<<< HEAD
IPHONEOS_DEPLOYMENT_TARGET = 14; IPHONEOS_DEPLOYMENT_TARGET = 14;
=======
IPHONEOS_DEPLOYMENT_TARGET = 12;
>>>>>>> ios-rebase
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "C93D3524-5C6F-466E-B12B-833663B7EAE0"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = "C93D3524-5C6F-466E-B12B-833663B7EAE0";
@@ -5884,7 +5914,11 @@
); );
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist"; INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
<<<<<<< HEAD
IPHONEOS_DEPLOYMENT_TARGET = 14; IPHONEOS_DEPLOYMENT_TARGET = 14;
=======
IPHONEOS_DEPLOYMENT_TARGET = 12;
>>>>>>> ios-rebase
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "com.mojang.mcpe-arm64"; PRODUCT_BUNDLE_IDENTIFIER = "com.mojang.mcpe-arm64";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -5978,7 +6012,11 @@
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src"; HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
<<<<<<< HEAD
IPHONEOS_DEPLOYMENT_TARGET = 14; IPHONEOS_DEPLOYMENT_TARGET = 14;
=======
IPHONEOS_DEPLOYMENT_TARGET = 12;
>>>>>>> ios-rebase
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "64BA8967-1A9A-4980-972C-42E75AD5E023"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = "64BA8967-1A9A-4980-972C-42E75AD5E023";
@@ -6010,7 +6048,11 @@
); );
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist"; INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
<<<<<<< HEAD
IPHONEOS_DEPLOYMENT_TARGET = 14; IPHONEOS_DEPLOYMENT_TARGET = 14;
=======
IPHONEOS_DEPLOYMENT_TARGET = 12;
>>>>>>> ios-rebase
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = ( OTHER_CFLAGS = (
"-DNS_BLOCK_ASSERTIONS=1", "-DNS_BLOCK_ASSERTIONS=1",
@@ -6076,7 +6118,11 @@
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src"; HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
<<<<<<< HEAD
IPHONEOS_DEPLOYMENT_TARGET = 14; IPHONEOS_DEPLOYMENT_TARGET = 14;
=======
IPHONEOS_DEPLOYMENT_TARGET = 12;
>>>>>>> ios-rebase
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
RUN_CLANG_STATIC_ANALYZER = NO; RUN_CLANG_STATIC_ANALYZER = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@@ -6104,7 +6150,11 @@
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src"; HEADER_SEARCH_PATHS = "$(SRCROOT)/../../src";
<<<<<<< HEAD
IPHONEOS_DEPLOYMENT_TARGET = 14; IPHONEOS_DEPLOYMENT_TARGET = 14;
=======
IPHONEOS_DEPLOYMENT_TARGET = 12;
>>>>>>> ios-rebase
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
RUN_CLANG_STATIC_ANALYZER = NO; RUN_CLANG_STATIC_ANALYZER = NO;
@@ -6137,7 +6187,11 @@
); );
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist"; INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
<<<<<<< HEAD
IPHONEOS_DEPLOYMENT_TARGET = 14; IPHONEOS_DEPLOYMENT_TARGET = 14;
=======
IPHONEOS_DEPLOYMENT_TARGET = 12;
>>>>>>> ios-rebase
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "com.mojang.mcpe-arm64"; PRODUCT_BUNDLE_IDENTIFIER = "com.mojang.mcpe-arm64";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
@@ -6172,7 +6226,11 @@
); );
INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist"; INFOPLIST_FILE = "minecraftpe/minecraftpe-Info.plist";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games";
<<<<<<< HEAD
IPHONEOS_DEPLOYMENT_TARGET = 14; IPHONEOS_DEPLOYMENT_TARGET = 14;
=======
IPHONEOS_DEPLOYMENT_TARGET = 12;
>>>>>>> ios-rebase
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "com.mojang.mcpe-arm64"; PRODUCT_BUNDLE_IDENTIFIER = "com.mojang.mcpe-arm64";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";

View File

@@ -90,6 +90,7 @@
#include "../network/command/CommandServer.h" #include "../network/command/CommandServer.h"
#include "gamemode/CreatorMode.h" #include "gamemode/CreatorMode.h"
#include "../world/level/GrassColor.h"
static void checkGlError(const char* tag) { static void checkGlError(const char* tag) {
#ifdef GLDEBUG #ifdef GLDEBUG
while (1) { while (1) {
@@ -1127,12 +1128,31 @@ void Minecraft::init()
textures = new Textures(&options, platform()); textures = new Textures(&options, platform());
textures->addDynamicTexture(new WaterTexture()); textures->addDynamicTexture(new WaterTexture());
textures->addDynamicTexture(new WaterSideTexture()); textures->addDynamicTexture(new WaterSideTexture());
textures->addDynamicTexture(new FireTexture());
gui.texturesLoaded(textures); gui.texturesLoaded(textures);
levelRenderer = new LevelRenderer(this); levelRenderer = new LevelRenderer(this);
gameRenderer = new GameRenderer(this); gameRenderer = new GameRenderer(this);
particleEngine = new ParticleEngine(level, textures); particleEngine = new ParticleEngine(level, textures);
// 4j's code for reference
// FoliageColor::init(textures->loadTexturePixels(L"misc/foliagecolor.png"));
// my code
TextureId foliageId = (textures->loadTexture("misc/foliagecolor.png")); // loading the uh png for foliage color
int* foliagePixels = textures->loadTexturePixels(foliageId, "misc/foliagecolor.png");
// now i can finally initialize foliage color, probably not the best way to handle this but i cant be arsed rn
FoliageColor::init(foliagePixels);
TextureId grassId = (textures->loadTexture("misc/foliagecolor.png")); // loading the uh png for foliage color
int* grassPixels = textures->loadTexturePixels(grassId, "misc/foliagecolor.png");
GrassColor::init(grassPixels);
bool tint = options.getBooleanValue(OPTIONS_FOLIAGE_TINT); // finally, toggleable foliage color
FoliageColor::setUseTint(tint);
GrassColor::setUseTint(tint);
// Platform specific initialization here // Platform specific initialization here
font = new Font(&options, "font/default8.png", textures); font = new Font(&options, "font/default8.png", textures);
@@ -1383,6 +1403,12 @@ void Minecraft::_levelGenerated()
player->resetPos(false); player->resetPos(false);
} }
if (level && level->dimension) {
// For example, if you want FogType or any other option
level->dimension->FogType = options.getBooleanValue(OPTIONS_FOG_TYPE);
}
this->cameraTargetPlayer = player; this->cameraTargetPlayer = player;
std::string serverName = options.getStringValue(OPTIONS_USERNAME) + " - " + level->getLevelData()->levelName; std::string serverName = options.getStringValue(OPTIONS_USERNAME) + " - " + level->getLevelData()->levelName;

View File

@@ -60,6 +60,12 @@ OptionBool useTouchscreen("useTouchscreen", true);
OptionBool serverVisible("servervisible", true); OptionBool serverVisible("servervisible", true);
OptionBool foliageTint("foliagetint", false);
OptionInt fogType("fogType", 0, 0, 2);
OptionBool javaHud("javaHud", false);
OptionInt keyForward("key.forward", Keyboard::KEY_W); OptionInt keyForward("key.forward", Keyboard::KEY_W);
OptionInt keyLeft("key.left", Keyboard::KEY_A); OptionInt keyLeft("key.left", Keyboard::KEY_A);
OptionInt keyBack("key.back", Keyboard::KEY_S); OptionInt keyBack("key.back", Keyboard::KEY_S);
@@ -136,6 +142,8 @@ void Options::initTable() {
m_options[OPTIONS_USE_TOUCHSCREEN] = &useTouchscreen; m_options[OPTIONS_USE_TOUCHSCREEN] = &useTouchscreen;
m_options[OPTIONS_SERVER_VISIBLE] = &serverVisible; m_options[OPTIONS_SERVER_VISIBLE] = &serverVisible;
m_options[OPTIONS_KEY_FORWARD] = &keyForward; m_options[OPTIONS_KEY_FORWARD] = &keyForward;
@@ -160,6 +168,12 @@ void Options::initTable() {
m_options[OPTIONS_BAR_ON_TOP] = &barOnTop; m_options[OPTIONS_BAR_ON_TOP] = &barOnTop;
m_options[OPTIONS_ALLOW_SPRINT] = &allowSprint; m_options[OPTIONS_ALLOW_SPRINT] = &allowSprint;
m_options[OPTIONS_RPI_CURSOR] = &rpiCursor; m_options[OPTIONS_RPI_CURSOR] = &rpiCursor;
m_options[OPTIONS_FOLIAGE_TINT] = &foliageTint;
// more options yay
m_options[OPTIONS_FOG_TYPE] = &fogType;
m_options[OPTIONS_JAVA_HUD] = &javaHud;
m_options[OPTIONS_AUTOJUMP] = &autoJump; m_options[OPTIONS_AUTOJUMP] = &autoJump;
m_options[OPTIONS_LAST_IP] = &lastIp; m_options[OPTIONS_LAST_IP] = &lastIp;

View File

@@ -84,6 +84,9 @@ enum OptionId {
OPTIONS_LAST_IP, OPTIONS_LAST_IP,
OPTIONS_RPI_CURSOR, OPTIONS_RPI_CURSOR,
OPTIONS_FOLIAGE_TINT,
OPTIONS_FOG_TYPE,
OPTIONS_JAVA_HUD,
// Should be last! // Should be last!
OPTIONS_COUNT OPTIONS_COUNT
}; };

View File

@@ -36,7 +36,7 @@ const float Gui::DropTicks = 40.0f;
//#include <android/log.h> //#include <android/log.h>
Gui::Gui(Minecraft* minecraft) Gui::Gui(Minecraft* minecraft)
: minecraft(minecraft), : minecraft(minecraft),
tickCount(0), tickCount(0),
progress(0), progress(0),
overlayMessageTime(0), overlayMessageTime(0),
@@ -103,6 +103,12 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) {
} }
} }
// @todo - Shredder: I added this here but currently viginette is broken so i cant do much about it.
// if (minecraft->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS)){
// this->renderVignette(this->minecraft->player->getBrightness(a), screenWidth, screenHeight);
// }
// shredder end
if(minecraft->player->getSleepTimer() > 0) { if(minecraft->player->getSleepTimer() > 0) {
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
glDisable(GL_ALPHA_TEST); glDisable(GL_ALPHA_TEST);
@@ -344,6 +350,8 @@ void Gui::displayClientMessage(const std::string& messageId) {
addMessage(messageId); addMessage(messageId);
} }
// @todo - shredder: Function seems to be completely fine and ported over from java beta, but renders opaque??? need to investigate
void Gui::renderVignette(float br, int w, int h) { void Gui::renderVignette(float br, int w, int h) {
br = 1 - br; br = 1 - br;
if (br < 0) br = 0; if (br < 0) br = 0;
@@ -354,7 +362,10 @@ void Gui::renderVignette(float br, int w, int h) {
glDepthMask(false); glDepthMask(false);
glBlendFunc2(GL_ZERO, GL_ONE_MINUS_SRC_COLOR); glBlendFunc2(GL_ZERO, GL_ONE_MINUS_SRC_COLOR);
glColor4f2(tbr, tbr, tbr, 1); glColor4f2(tbr, tbr, tbr, 1);
minecraft->textures->loadAndBindTexture("misc/vignette.png"); minecraft->textures->loadAndBindTexture("misc/vignette.png");
glTexParameteri2(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri2(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
Tesselator& t = Tesselator::instance; Tesselator& t = Tesselator::instance;
t.begin(); t.begin();
@@ -1105,22 +1116,41 @@ void Gui::renderToolBar( float a, int ySlot, const int screenWidth ) {
// Draw count // Draw count
//Tesselator& t = Tesselator::instance; //Tesselator& t = Tesselator::instance;
glPushMatrix2();
glScalef2(InvGuiScale + InvGuiScale, InvGuiScale + InvGuiScale, 1);
const float k = 0.5f * GuiScale;
const float k = 0.5f * GuiScale;
if (minecraft->options.getBooleanValue(OPTIONS_JAVA_HUD)) // if true enables the java beta item count size and color and calls the java items decorations
{
t.beginOverride(); t.beginOverride();
if (minecraft->gameMode->isSurvivalType()) { if (minecraft->gameMode->isSurvivalType()) {
x = baseItemX; x = baseItemX;
for (int i = 0; i < slots; i++) { for (int i = 0; i < slots; i++) {
ItemInstance* item = minecraft->player->inventory->getItem(i); ItemInstance* item = minecraft->player->inventory->getItem(i);
if (item && item->count >= 0) if (item && item->count >= 0)
renderSlotText(item, k*x, k*ySlot + 1, true, true); ItemRenderer::renderGuiItemDecorations(minecraft->font, minecraft->textures, minecraft->player->inventory->getItem(i), x, (float)ySlot);
x += 20; x += 20;
} }
} }
minecraft->textures->loadAndBindTexture("font/default8.png"); minecraft->textures->loadAndBindTexture("font/default8.png");
t.endOverrideAndDraw(); t.endOverrideAndDraw();
}
else { // otherwise uses the normal pocket edition one
glPushMatrix2();
glScalef2(InvGuiScale + InvGuiScale, InvGuiScale + InvGuiScale, 1);
t.beginOverride();
if (minecraft->gameMode->isSurvivalType()) {
x = baseItemX;
for (int i = 0; i < slots; i++) {
ItemInstance* item = minecraft->player->inventory->getItem(i);
if (item && item->count >= 0)
renderSlotText(item, k*x, k*ySlot, true, true);
x += 20;
}
}
minecraft->textures->loadAndBindTexture("font/default8.png");
t.endOverrideAndDraw();
glPopMatrix2(); glPopMatrix2();
}
} }

View File

@@ -228,7 +228,11 @@ void OptionsScreen::generateOptionScreens() {
optionPanes[4]->addOptionItem(OPTIONS_ALLOW_SPRINT, minecraft) optionPanes[4]->addOptionItem(OPTIONS_ALLOW_SPRINT, minecraft)
.addOptionItem(OPTIONS_BAR_ON_TOP, minecraft) .addOptionItem(OPTIONS_BAR_ON_TOP, minecraft)
.addOptionItem(OPTIONS_RPI_CURSOR, minecraft); .addOptionItem(OPTIONS_RPI_CURSOR, minecraft)
.addOptionItem(OPTIONS_FOLIAGE_TINT, minecraft)
.addOptionItem(OPTIONS_JAVA_HUD, minecraft)
.addOptionItem(OPTIONS_FOG_TYPE, minecraft);
} }
void OptionsScreen::mouseClicked(int x, int y, int buttonNum) { void OptionsScreen::mouseClicked(int x, int y, int buttonNum) {

View File

@@ -7,6 +7,10 @@
#include "../../world/level/Region.h" #include "../../world/level/Region.h"
#include "../../world/level/chunk/LevelChunk.h" #include "../../world/level/chunk/LevelChunk.h"
#include "../../util/Mth.h" #include "../../util/Mth.h"
#include "../../world/level/biome/BiomeSource.h"
#include "../../world/level/Level.h"
//#include "../../platform/time.h" //#include "../../platform/time.h"
/*static*/ int Chunk::updates = 0; /*static*/ int Chunk::updates = 0;

View File

@@ -25,6 +25,8 @@
#include "../../client/player/LocalPlayer.h" #include "../../client/player/LocalPlayer.h"
#include "../../world/level/GrassColor.h"
#ifdef GFX_SMALLER_CHUNKS #ifdef GFX_SMALLER_CHUNKS
/* static */ const int LevelRenderer::CHUNK_SIZE = 8; /* static */ const int LevelRenderer::CHUNK_SIZE = 8;
#else #else
@@ -32,7 +34,7 @@
#endif #endif
LevelRenderer::LevelRenderer( Minecraft* mc) LevelRenderer::LevelRenderer( Minecraft* mc)
: mc(mc), : mc(mc),
textures(mc->textures), textures(mc->textures),
level(NULL), level(NULL),
cullStep(0), cullStep(0),
@@ -47,6 +49,7 @@ LevelRenderer::LevelRenderer( Minecraft* mc)
xMaxChunk(0), yMaxChunk(0), zMaxChunk(0), xMaxChunk(0), yMaxChunk(0), zMaxChunk(0),
lastViewDistance(-1), lastViewDistance(-1),
lastFogType(-1),
noEntityRenderFrames(2), noEntityRenderFrames(2),
totalEntities(0), totalEntities(0),
@@ -143,6 +146,10 @@ void LevelRenderer::setLevel( Level* level )
level->addListener(this); level->addListener(this);
allChanged(); allChanged();
} }
if (mc->options.getBooleanValue(OPTIONS_AMBIENT_OCCLUSION)) {
mc->useAmbientOcclusion = !mc->useAmbientOcclusion;
allChanged();
}
} }
void LevelRenderer::allChanged() void LevelRenderer::allChanged()
@@ -155,14 +162,21 @@ void LevelRenderer::allChanged()
Tile::leaves_carried->setFancy(fancy); Tile::leaves_carried->setFancy(fancy);
lastViewDistance = mc->options.getIntValue(OPTIONS_VIEW_DISTANCE); lastViewDistance = mc->options.getIntValue(OPTIONS_VIEW_DISTANCE);
lastFogType = mc->options.getIntValue(OPTIONS_FOG_TYPE);
bool tint = mc->options.getBooleanValue(OPTIONS_FOLIAGE_TINT);
FoliageColor::setUseTint(tint);
GrassColor::setUseTint(tint);
int dist = (512 >> 3) << (3 - lastViewDistance); int dist = (512 >> 3) << (3 - lastViewDistance);
if (lastViewDistance <= 2 && mc->isPowerVR()) if (lastViewDistance <= 2 && mc->isPowerVR())
dist = (int)((float)dist * 0.8f); dist = (int)((float)dist * 0.8f);
LOGI("last: %d, power: %d\n", lastViewDistance, mc->isPowerVR()); LOGI("last: %d, power: %d\n", lastViewDistance, mc->isPowerVR());
#if defined(RPI) #if defined(RPI)
dist *= 0.6f; dist *= 0.6f;
#endif #endif
if (dist > 400) dist = 400; if (dist > 400) dist = 400;
/* /*
@@ -301,6 +315,17 @@ int LevelRenderer::render( Mob* player, int layer, float alpha )
allChanged(); allChanged();
} }
int currentFogType = mc->options.getIntValue(OPTIONS_FOG_TYPE);
if (currentFogType != lastFogType) {
lastFogType = currentFogType;
if (level && level->dimension) {
level->dimension->FogType = currentFogType; // use new fog stuff
}
allChanged();
}
TIMER_PUSH("sortchunks"); TIMER_PUSH("sortchunks");
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
chunkFixOffs = (chunkFixOffs + 1) % chunksLength; chunkFixOffs = (chunkFixOffs + 1) % chunksLength;
@@ -569,11 +594,11 @@ int LevelRenderer::renderChunks( int from, int to, int layer, float alpha )
for (unsigned int i = 0; i < _renderChunks.size(); ++i) { for (unsigned int i = 0; i < _renderChunks.size(); ++i) {
Chunk* chunk = _renderChunks[i]; Chunk* chunk = _renderChunks[i];
#ifdef USE_VBO #ifdef USE_VBO
renderList.addR(chunk->getRenderChunk(layer)); renderList.addR(chunk->getRenderChunk(layer));
#else #else
renderList.add(chunk->getList(layer)); renderList.add(chunk->getList(layer));
#endif #endif
renderList.next(); renderList.next();
} }
@@ -1128,53 +1153,53 @@ void LevelRenderer::addParticle(const std::string& name, float x, float y, float
/* /*
void LevelRenderer::addParticle(ParticleType::Id name, float x, float y, float z, float xa, float ya, float za, int data) { void LevelRenderer::addParticle(ParticleType::Id name, float x, float y, float z, float xa, float ya, float za, int data) {
float xd = mc->cameraTargetPlayer->x - x; float xd = mc->cameraTargetPlayer->x - x;
float yd = mc->cameraTargetPlayer->y - y; float yd = mc->cameraTargetPlayer->y - y;
float zd = mc->cameraTargetPlayer->z - z; float zd = mc->cameraTargetPlayer->z - z;
const float particleDistance = 16; const float particleDistance = 16;
if (xd * xd + yd * yd + zd * zd > particleDistance * particleDistance) return; if (xd * xd + yd * yd + zd * zd > particleDistance * particleDistance) return;
//static Stopwatch sw; //static Stopwatch sw;
//sw.start(); //sw.start();
//Particle* p = NULL; //Particle* p = NULL;
if (name == ParticleType::bubble) mc->particleEngine->add( new BubbleParticle(level, x, y, z, xa, ya, za) ); if (name == ParticleType::bubble) mc->particleEngine->add( new BubbleParticle(level, x, y, z, xa, ya, za) );
else if (name == ParticleType::crit) mc->particleEngine->add(new CritParticle2(level, x, y, z, xa, ya, za) ); else if (name == ParticleType::crit) mc->particleEngine->add(new CritParticle2(level, x, y, z, xa, ya, za) );
else if (name == ParticleType::smoke) mc->particleEngine->add(new SmokeParticle(level, x, y, z, xa, ya, za) ); else if (name == ParticleType::smoke) mc->particleEngine->add(new SmokeParticle(level, x, y, z, xa, ya, za) );
else if (name == ParticleType::explode) mc->particleEngine->add( new ExplodeParticle(level, x, y, z, xa, ya, za) ); else if (name == ParticleType::explode) mc->particleEngine->add( new ExplodeParticle(level, x, y, z, xa, ya, za) );
else if (name == ParticleType::flame) mc->particleEngine->add( new FlameParticle(level, x, y, z, xa, ya, za) ); else if (name == ParticleType::flame) mc->particleEngine->add( new FlameParticle(level, x, y, z, xa, ya, za) );
else if (name == ParticleType::lava) mc->particleEngine->add( new LavaParticle(level, x, y, z) ); else if (name == ParticleType::lava) mc->particleEngine->add( new LavaParticle(level, x, y, z) );
else if (name == ParticleType::largesmoke) mc->particleEngine->add( new SmokeParticle(level, x, y, z, xa, ya, za, 2.5f) ); else if (name == ParticleType::largesmoke) mc->particleEngine->add( new SmokeParticle(level, x, y, z, xa, ya, za, 2.5f) );
else if (name == ParticleType::reddust) mc->particleEngine->add( new RedDustParticle(level, x, y, z, xa, ya, za) ); else if (name == ParticleType::reddust) mc->particleEngine->add( new RedDustParticle(level, x, y, z, xa, ya, za) );
else if (name == ParticleType::iconcrack) mc->particleEngine->add( new BreakingItemParticle(level, x, y, z, xa, ya, za, Item::items[data]) ); else if (name == ParticleType::iconcrack) mc->particleEngine->add( new BreakingItemParticle(level, x, y, z, xa, ya, za, Item::items[data]) );
//switch (name) { //switch (name) {
// case ParticleType::bubble: p = new BubbleParticle(level, x, y, z, xa, ya, za); break; // case ParticleType::bubble: p = new BubbleParticle(level, x, y, z, xa, ya, za); break;
// case ParticleType::crit: p = new CritParticle2(level, x, y, z, xa, ya, za); break; // case ParticleType::crit: p = new CritParticle2(level, x, y, z, xa, ya, za); break;
// case ParticleType::smoke: p = new SmokeParticle(level, x, y, z, xa, ya, za); break; // case ParticleType::smoke: p = new SmokeParticle(level, x, y, z, xa, ya, za); break;
// //case ParticleType::note: p = new NoteParticle(level, x, y, z, xa, ya, za); break; // //case ParticleType::note: p = new NoteParticle(level, x, y, z, xa, ya, za); break;
// case ParticleType::explode: p = new ExplodeParticle(level, x, y, z, xa, ya, za); break; // case ParticleType::explode: p = new ExplodeParticle(level, x, y, z, xa, ya, za); break;
// case ParticleType::flame: p = new FlameParticle(level, x, y, z, xa, ya, za); break; // case ParticleType::flame: p = new FlameParticle(level, x, y, z, xa, ya, za); break;
// case ParticleType::lava: p = new LavaParticle(level, x, y, z); break; // case ParticleType::lava: p = new LavaParticle(level, x, y, z); break;
// //case ParticleType::splash: p = new SplashParticle(level, x, y, z, xa, ya, za); break; // //case ParticleType::splash: p = new SplashParticle(level, x, y, z, xa, ya, za); break;
// case ParticleType::largesmoke: p = new SmokeParticle(level, x, y, z, xa, ya, za, 2.5f); break; // case ParticleType::largesmoke: p = new SmokeParticle(level, x, y, z, xa, ya, za, 2.5f); break;
// case ParticleType::reddust: p = new RedDustParticle(level, x, y, z, xa, ya, za); break; // case ParticleType::reddust: p = new RedDustParticle(level, x, y, z, xa, ya, za); break;
// case ParticleType::iconcrack: p = new BreakingItemParticle(level, x, y, z, xa, ya, za, Item::items[data]); break; // case ParticleType::iconcrack: p = new BreakingItemParticle(level, x, y, z, xa, ya, za, Item::items[data]); break;
// //case ParticleType::snowballpoof: p = new BreakingItemParticle(level, x, y, z, Item::snowBall); break; // //case ParticleType::snowballpoof: p = new BreakingItemParticle(level, x, y, z, Item::snowBall); break;
// //case ParticleType::slime: p = new BreakingItemParticle(level, x, y, z, Item::slimeBall); break; // //case ParticleType::slime: p = new BreakingItemParticle(level, x, y, z, Item::slimeBall); break;
// //case ParticleType::heart: p = new HeartParticle(level, x, y, z, xa, ya, za); break; // //case ParticleType::heart: p = new HeartParticle(level, x, y, z, xa, ya, za); break;
// default: // default:
// LOGW("Couldn't find particle of type: %d\n", name); // LOGW("Couldn't find particle of type: %d\n", name);
// break; // break;
//} //}
//if (p) { //if (p) {
// mc->particleEngine->add(p); // mc->particleEngine->add(p);
//} //}
//sw.stop(); //sw.stop();
//sw.printEvery(50, "add-particle-enum"); //sw.printEvery(50, "add-particle-enum");
} }
*/ */

View File

@@ -113,6 +113,9 @@ private:
bool occlusionCheck; bool occlusionCheck;
int lastViewDistance; int lastViewDistance;
// shredder added again...
int lastFogType;
int ticks; int ticks;
int starList, skyList, darkList; int starList, skyList, darkList;

View File

@@ -249,6 +249,37 @@ int Textures::crispBlend( int c0, int c1 )
return (a << 24) | (r << 16) | (g << 8) | b; return (a << 24) | (r << 16) | (g << 8) | b;
} }
// shredder here, moved the code from minecraft.cpp bcus that isnt the right place
// had to implement this because i couldn't find a similar function in the code to do this
int* Textures::loadTexturePixels(TextureId texId, const std::string& resourceName){
const TextureData* texture = getTemporaryTextureData(texId); // storing raw pixels
int size = texture->w * texture->h; // gets the size of our funny lil guy
int* pixels = new int[size]; // memory leaks be galore
unsigned char* raw = texture->data; // storing raw data into our beloved variable
for (int i = 0; i < (texture->w * texture->h); i++){
// my head hurts i hate working with this
// uh since each pixel stores r g b a, aka the color channels which are each one byte, we multiply them by 4 to move from one pixel to another
int r = raw[i * 4 + 0]; // gets us the first channel aka red
int g = raw[i * 4 + 1]; // gets us the second channel green
int b = raw[i * 4 + 2]; // gets us the third channel blue
int a = raw[i * 4 + 3]; // gets us the alpha channel
// woohoo pixels uh should have been seperated into their colors now hopefully
// r g b a
// ugh we now got to turn it into the AA RR GGBB format aak 0xAARRGGBB
// b gets 0 - 7 (8 bits), g gets 7 - 15 (8 bits), r gets 16 - 23 (8 bits), alpha gets the last ones 24 - 31 (8 bits),
pixels[i] = (a << 24) | (r << 16) | (g << 8) | (b); // shuld combine them into one 32 bit int unless i did something dumb
}
return pixels; // your meal has been prepared john colors
}
///*public*/ int loadHttpTexture(std::string url, std::string backup) { ///*public*/ int loadHttpTexture(std::string url, std::string backup) {
// HttpTexture texture = httpTextures.get(url); // HttpTexture texture = httpTextures.get(url);
// if (texture != NULL) { // if (texture != NULL) {

View File

@@ -44,6 +44,8 @@ public:
TextureId assignTexture(const std::string& resourceName, const TextureData& img); TextureId assignTexture(const std::string& resourceName, const TextureData& img);
const TextureData* getTemporaryTextureData(TextureId id); const TextureData* getTemporaryTextureData(TextureId id);
int* loadTexturePixels(TextureId texId, const std::string& resourceName);
void tick(bool uploadToGraphicsCard); void tick(bool uploadToGraphicsCard);
void clear(); void clear();

View File

@@ -13,6 +13,7 @@
#include "../../world/level/tile/BedTile.h" #include "../../world/level/tile/BedTile.h"
#include "../../world/level/tile/StemTile.h" #include "../../world/level/tile/StemTile.h"
#include "../../world/level/tile/StairTile.h" #include "../../world/level/tile/StairTile.h"
#include "../../world/level/tile/FireTile.h"
#include "../../world/Direction.h" #include "../../world/Direction.h"
#include "../../world/Facing.h" #include "../../world/Facing.h"
#include "tileentity/TileEntityRenderer.h" #include "tileentity/TileEntityRenderer.h"
@@ -157,8 +158,8 @@ bool TileRenderer::tesselateInWorld( Tile* tt, int x, int y, int z )
return tesselateRowInWorld(tt, x, y, z); return tesselateRowInWorld(tt, x, y, z);
} else if (shape == Tile::SHAPE_TORCH) { } else if (shape == Tile::SHAPE_TORCH) {
return tesselateTorchInWorld(tt, x, y, z); return tesselateTorchInWorld(tt, x, y, z);
//} else if (shape == Tile::SHAPE_FIRE) { } else if (shape == Tile::SHAPE_FIRE) {
// return tesselateFireInWorld(tt, x, y, z); return tesselateFireInWorld(tt, x, y, z);
//} else if (shape == Tile::SHAPE_RED_DUST) { //} else if (shape == Tile::SHAPE_RED_DUST) {
// return tesselateDustInWorld(tt, x, y, z); // return tesselateDustInWorld(tt, x, y, z);
} else if (shape == Tile::SHAPE_LADDER) { } else if (shape == Tile::SHAPE_LADDER) {
@@ -222,6 +223,278 @@ bool TileRenderer::tesselateTorchInWorld( Tile* tt, int x, int y, int z )
return true; return true;
} }
bool TileRenderer::tesselateFireInWorld( Tile* tt, int x, int y, int z )
{
// @todo: fire alpha transparency seems to be scuffed, also it seems i might have messed up the second layer while porting from lce/java , need to look into it - shredder
Tesselator& t = Tesselator::instance;
int tex = tt->getTexture(0);
if (fixedTexture >= 0) tex = fixedTexture;
float br = tt->getBrightness( level, x, y, z );
t.color( br, br, br );
int xt = ((tex & 0xf) << 4);
int yt = tex & 0xf0;
float u0 = (xt) / 256.0f;
float u1 = (xt + 15.99f) / 256.0f;
float v0 = (yt) / 256.0f;
float v1 = (yt + 15.99f) / 256.0f;
float h = 1.4f;
if ( level->isSolidBlockingTile( x, y - 1, z ) || Tile::fire->canBurn( level, x, y - 1, z ) )
{
float x0 = x + 0.5f + 0.2f;
float x1 = x + 0.5f - 0.2f;
float z0 = z + 0.5f + 0.2f;
float z1 = z + 0.5f - 0.2f;
float x0_ = x + 0.5f - 0.3f;
float x1_ = x + 0.5f + 0.3f;
float z0_ = z + 0.5f - 0.3f;
float z1_ = z + 0.5f + 0.3f;
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z + 1 ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z + 1 ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z + 0 ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z + 0 ), ( float )( u0 ), ( float )( v0 ) );
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v0 ) );
u0 = (xt) / 256.0f;
u1 = (xt + 15.99f) / 256.0f;
v0 = (yt) / 256.0f;
v1 = (yt + 15.99f) / 256.0f;
t.vertexUV( ( float )( x + 1 ), ( float )( y + h ), ( float )( z1_ ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 1 ), ( float )( y + 0 ), ( float )( z1 ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 0 ), ( float )( y + 0 ), ( float )( z1 ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 0 ), ( float )( y + h ), ( float )( z1_ ), ( float )( u0 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 0 ), ( float )( y + h ), ( float )( z0_ ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 0 ), ( float )( y + 0 ), ( float )( z0 ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 1 ), ( float )( y + 0 ), ( float )( z0 ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 1 ), ( float )( y + h ), ( float )( z0_ ), ( float )( u0 ), ( float )( v0 ) );
x0 = x + 0.5f - 0.5f;
x1 = x + 0.5f + 0.5f;
z0 = z + 0.5f - 0.5f;
z1 = z + 0.5f + 0.5f;
x0_ = x + 0.5f - 0.4f;
x1_ = x + 0.5f + 0.4f;
z0_ = z + 0.5f - 0.4f;
z1_ = z + 0.5f + 0.4f;
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z + 0 ), ( float )( u0 ), ( float )( v0 ) );
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z + 0 ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z + 1 ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z + 1 ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v0 ) );
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v0 ) );
u0 = (xt) / 256.0f;
u1 = (xt + 15.99f) / 256.0f;
v0 = (yt) / 256.0f;
v1 = (yt + 15.99f) / 256.0f;
t.vertexUV( ( float )( x + 0 ), ( float )( y + h ), ( float )( z1_ ), ( float )( u0 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 0 ), ( float )( y + 0 ), ( float )( z1 ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 1 ), ( float )( y + 0 ), ( float )( z1 ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 1 ), ( float )( y + h ), ( float )( z1_ ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 1 ), ( float )( y + h ), ( float )( z0_ ), ( float )( u0 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 1 ), ( float )( y + 0 ), ( float )( z0 ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 0 ), ( float )( y + 0 ), ( float )( z0 ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 0 ), ( float )( y + h ), ( float )( z0_ ), ( float )( u1 ), ( float )( v0 ) );
}
else
{
float r = 0.2f;
float yo = 1 / 16.0f;
if ( ( ( x + y + z ) & 1 ) == 1 )
{
u0 = (xt) / 256.0f;
u1 = (xt + 15.99f) / 256.0f;
v0 = (yt) / 256.0f;
v1 = (yt + 15.99f) / 256.0f;
}
if ( ( ( x / 2 + y / 2 + z / 2 ) & 1 ) == 1 )
{
float tmp = u1;
u1 = u0;
u0 = tmp;
}
if ( Tile::fire->canBurn( level, x - 1, y, z ) )
{
t.vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z +
1.0f ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
1.0f ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
0.0f ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z +
0.0f ), ( float )( u0 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z +
0.0f ), ( float )( u0 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
0.0f ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
1.0f ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + r ), ( float )( y + h + yo ), ( float )( z +
1.0f ), ( float )( u1 ), ( float )( v0 ) );
}
if ( Tile::fire->canBurn( level, x + 1, y, z ) )
{
t.vertexUV( ( float )( x + 1 - r ), ( float )( y + h + yo ), ( float )( z +
0.0f ), ( float )( u0 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 1 - 0 ), ( float )( y + 0 + yo ), ( float )( z +
0.0f ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 1 - 0 ), ( float )( y + 0 + yo ), ( float )( z +
1.0f ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 1 - r ), ( float )( y + h + yo ), ( float )( z +
1.0f ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 1.0f - r ), ( float )( y + h + yo ), ( float )( z +
1.0f ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 1.0f - 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
1.0f ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 1.0f - 0 ), ( float )( y + 0.0f + yo ), ( float )( z +
0.0f ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 1.0f - r ), ( float )( y + h + yo ), ( float )( z +
0.0f ), ( float )( u0 ), ( float )( v0 ) );
}
if ( Tile::fire->canBurn( level, x, y, z - 1 ) )
{
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z +
r ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
0.0f ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
0.0f ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z +
r ), ( float )( u0 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z +
r ), ( float )( u0 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
0.0f ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z +
0.0f ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z +
r ), ( float )( u1 ), ( float )( v0 ) );
}
if ( Tile::fire->canBurn( level, x, y, z + 1 ) )
{
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f -
r ), ( float )( u0 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f -
0.0f ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f -
0.0f ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f -
r ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f -
r ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 0.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f -
0.0f ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + 0.0f + yo ), ( float )( z + 1.0f -
0.0f ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 1.0f ), ( float )( y + h + yo ), ( float )( z + 1.0f -
r ), ( float )( u0 ), ( float )( v0 ) );
}
if ( Tile::fire->canBurn( level, x, y + 1.0f, z ) )
{
double x0 = x + 0.5f + 0.5f;
double x1 = x + 0.5f - 0.5f;
double z0 = z + 0.5f + 0.5f;
double z1 = z + 0.5f - 0.5f;
double x0_ = x + 0.5f - 0.5f;
double x1_ = x + 0.5f + 0.5f;
double z0_ = z + 0.5f - 0.5f;
double z1_ = z + 0.5f + 0.5f;
u0 = (xt) / 256.0f;
u1 = (xt + 15.99f) / 256.0f;
v0 = (yt) / 256.0f;
v1 = (yt + 15.99f) / 256.0f;
y += 1;
h = -0.2f;
if ( ( ( x + y + z ) & 1 ) == 0 )
{
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z +
0 ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z +
0 ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x0 ), ( float )( y + 0 ), ( float )( z +
1 ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z +
1 ), ( float )( u0 ), ( float )( v0 ) );
u0 = (xt) / 256.0f;
u1 = (xt + 15.99f) / 256.0f;
v0 = (yt) / 256.0f;
v1 = (yt + 15.99f) / 256.0f;
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z +
1.0f ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x1 ), ( float )( y + 0.0f ), ( float )( z +
1.0f ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x1 ), ( float )( y + 0.0f ), ( float )( z +
0 ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z +
0 ), ( float )( u0 ), ( float )( v0 ) );
}
else
{
t.vertexUV( ( float )( x + 0.0f ), ( float )( y +
h ), ( float )( z1_ ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 0.0f ), ( float )( y +
0.0f ), ( float )( z1 ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 1.0f ), ( float )( y +
0.0f ), ( float )( z1 ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 1.0f ), ( float )( y +
h ), ( float )( z1_ ), ( float )( u0 ), ( float )( v0 ) );
u0 = (xt) / 256.0f;
u1 = (xt + 15.99f) / 256.0f;
v0 = (yt) / 256.0f;
v1 = (yt + 15.99f) / 256.0f;
t.vertexUV( ( float )( x + 1.0f ), ( float )( y +
h ), ( float )( z0_ ), ( float )( u1 ), ( float )( v0 ) );
t.vertexUV( ( float )( x + 1.0f ), ( float )( y +
0.0f ), ( float )( z0 ), ( float )( u1 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 0.0f ), ( float )( y +
0.0f ), ( float )( z0 ), ( float )( u0 ), ( float )( v1 ) );
t.vertexUV( ( float )( x + 0.0f ), ( float )( y +
h ), ( float )( z0_ ), ( float )( u0 ), ( float )( v0 ) );
}
}
}
return true;
}
bool TileRenderer::tesselateLadderInWorld( Tile* tt, int x, int y, int z ) bool TileRenderer::tesselateLadderInWorld( Tile* tt, int x, int y, int z )
{ {
Tesselator& t = Tesselator::instance; Tesselator& t = Tesselator::instance;

View File

@@ -34,6 +34,8 @@ public:
bool tesselateFenceGateInWorld(FenceGateTile* tt, int x, int y, int z); bool tesselateFenceGateInWorld(FenceGateTile* tt, int x, int y, int z);
bool tesselateBedInWorld(Tile *tt, int x, int y, int z); bool tesselateBedInWorld(Tile *tt, int x, int y, int z);
bool tesselateRowInWorld(Tile* tt, int x, int y, int z); bool tesselateRowInWorld(Tile* tt, int x, int y, int z);
bool tesselateFireInWorld(Tile* tt, int x, int y, int z);
void tesselateTorch(Tile* tt, float x, float y, float z, float xxa, float zza); void tesselateTorch(Tile* tt, float x, float y, float z, float xxa, float zza);
void tesselateCrossTexture(Tile* tt, int data, float x, float y, float z); void tesselateCrossTexture(Tile* tt, int data, float x, float y, float z);

View File

@@ -40,18 +40,18 @@ EntityRenderDispatcher::EntityRenderDispatcher()
{ {
//@note: The Models (model/armor) will be deleted by resp. MobRenderer //@note: The Models (model/armor) will be deleted by resp. MobRenderer
assign( ER_ITEM_RENDERER, new ItemRenderer()); assign( ER_ITEM_RENDERER, new ItemRenderer());
assign( ER_HUMANOID_RENDERER, new HumanoidMobRenderer(new HumanoidModel(), 0)); assign( ER_HUMANOID_RENDERER, new HumanoidMobRenderer(new HumanoidModel(), 0.5));
assign( ER_PIG_RENDERER, new PigRenderer(new PigModel(), NULL/*new PigModel(0.5f)*/, 0)); assign( ER_PIG_RENDERER, new PigRenderer(new PigModel(0.5), NULL/*new PigModel(0.5f)*/, 0.7));
assign( ER_COW_RENDERER, new MobRenderer(new CowModel(), 0)); assign( ER_COW_RENDERER, new MobRenderer(new CowModel(), 0.7));
assign( ER_CHICKEN_RENDERER, new ChickenRenderer( new ChickenModel(), 0)); assign( ER_CHICKEN_RENDERER, new ChickenRenderer( new ChickenModel(), 0.3));
assign( ER_SHEEP_RENDERER, new SheepRenderer(new SheepModel(), new SheepFurModel(), 0)); assign( ER_SHEEP_RENDERER, new SheepRenderer(new SheepModel(), new SheepFurModel(), 0.7));
assign( ER_SKELETON_RENDERER, new HumanoidMobRenderer(new SkeletonModel(), 0.5f)); assign( ER_SKELETON_RENDERER, new HumanoidMobRenderer(new SkeletonModel(), 0.5f));
assign( ER_ZOMBIE_RENDERER, new HumanoidMobRenderer(new ZombieModel(), 0.5f)); assign( ER_ZOMBIE_RENDERER, new HumanoidMobRenderer(new ZombieModel(), 0.5f));
assign( ER_CREEPER_RENDERER, new CreeperRenderer()); assign( ER_CREEPER_RENDERER, new CreeperRenderer());
assign( ER_SPIDER_RENDERER, new SpiderRenderer()); assign( ER_SPIDER_RENDERER, new SpiderRenderer());
assign( ER_TNT_RENDERER, new TntRenderer()); assign( ER_TNT_RENDERER, new TntRenderer());
assign( ER_ARROW_RENDERER, new ArrowRenderer()); assign( ER_ARROW_RENDERER, new ArrowRenderer());
assign( ER_PLAYER_RENDERER, new PlayerRenderer(new HumanoidModel(0, 0, 64, 64), 0)); assign( ER_PLAYER_RENDERER, new PlayerRenderer(new HumanoidModel(0, 0, 64, 64), 0.5));
assign( ER_THROWNEGG_RENDERER, new ItemSpriteRenderer(Item::egg->getIcon(0))); assign( ER_THROWNEGG_RENDERER, new ItemSpriteRenderer(Item::egg->getIcon(0)));
assign( ER_SNOWBALL_RENDERER, new ItemSpriteRenderer(Item::snowBall->getIcon(0))); assign( ER_SNOWBALL_RENDERER, new ItemSpriteRenderer(Item::snowBall->getIcon(0)));
assign( ER_PAINTING_RENDERER, new PaintingRenderer()); assign( ER_PAINTING_RENDERER, new PaintingRenderer());
@@ -133,7 +133,7 @@ void EntityRenderDispatcher::render( Entity* entity, float x, float y, float z,
EntityRenderer* renderer = getRenderer(entity); EntityRenderer* renderer = getRenderer(entity);
if (renderer != NULL) { if (renderer != NULL) {
renderer->render(entity, x, y, z, rot, a); renderer->render(entity, x, y, z, rot, a);
//renderer->postRender(entity, x, y, z, rot, a); renderer->postRender(entity, x, y, z, rot, a);
} }
} }

View File

@@ -5,11 +5,17 @@
#include "../gles.h" #include "../gles.h"
#include "../../../world/phys/AABB.h" #include "../../../world/phys/AABB.h"
#include "EntityRenderDispatcher.h" #include "EntityRenderDispatcher.h"
#include "../../../util/Mth.h"
#include "../../../world/level/Level.h"
#include "../../../world/level/tile/Tile.h"
#include "../../Minecraft.h"
#include "../../Option.h"
EntityRenderDispatcher* EntityRenderer::entityRenderDispatcher = NULL; EntityRenderDispatcher* EntityRenderer::entityRenderDispatcher = NULL;
EntityRenderer::EntityRenderer() EntityRenderer::EntityRenderer()
: shadowRadius(0), : shadowRadius(0),
shadowStrength(1.0f) shadowStrength(1.0f)
{} {}
@@ -36,37 +42,37 @@ void EntityRenderer::render(const AABB& bb, float xo, float yo, float zo) {
glColor4f2(1, 1, 1, 1); glColor4f2(1, 1, 1, 1);
t.begin(); t.begin();
t.offset(xo, yo, zo); t.offset(xo, yo, zo);
//t.normal(0, 0, -1); t.normal(0, 0, -1);
t.vertex(bb.x0, bb.y1, bb.z0); t.vertex(bb.x0, bb.y1, bb.z0);
t.vertex(bb.x1, bb.y1, bb.z0); t.vertex(bb.x1, bb.y1, bb.z0);
t.vertex(bb.x1, bb.y0, bb.z0); t.vertex(bb.x1, bb.y0, bb.z0);
t.vertex(bb.x0, bb.y0, bb.z0); t.vertex(bb.x0, bb.y0, bb.z0);
//t.normal(0, 0, 1); t.normal(0, 0, 1);
t.vertex(bb.x0, bb.y0, bb.z1); t.vertex(bb.x0, bb.y0, bb.z1);
t.vertex(bb.x1, bb.y0, bb.z1); t.vertex(bb.x1, bb.y0, bb.z1);
t.vertex(bb.x1, bb.y1, bb.z1); t.vertex(bb.x1, bb.y1, bb.z1);
t.vertex(bb.x0, bb.y1, bb.z1); t.vertex(bb.x0, bb.y1, bb.z1);
//t.normal(0, -1, 0); t.normal(0, -1, 0);
t.vertex(bb.x0, bb.y0, bb.z0); t.vertex(bb.x0, bb.y0, bb.z0);
t.vertex(bb.x1, bb.y0, bb.z0); t.vertex(bb.x1, bb.y0, bb.z0);
t.vertex(bb.x1, bb.y0, bb.z1); t.vertex(bb.x1, bb.y0, bb.z1);
t.vertex(bb.x0, bb.y0, bb.z1); t.vertex(bb.x0, bb.y0, bb.z1);
//t.normal(0, 1, 0); t.normal(0, 1, 0);
t.vertex(bb.x0, bb.y1, bb.z1); t.vertex(bb.x0, bb.y1, bb.z1);
t.vertex(bb.x1, bb.y1, bb.z1); t.vertex(bb.x1, bb.y1, bb.z1);
t.vertex(bb.x1, bb.y1, bb.z0); t.vertex(bb.x1, bb.y1, bb.z0);
t.vertex(bb.x0, bb.y1, bb.z0); t.vertex(bb.x0, bb.y1, bb.z0);
//t.normal(-1, 0, 0); t.normal(-1, 0, 0);
t.vertex(bb.x0, bb.y0, bb.z1); t.vertex(bb.x0, bb.y0, bb.z1);
t.vertex(bb.x0, bb.y1, bb.z1); t.vertex(bb.x0, bb.y1, bb.z1);
t.vertex(bb.x0, bb.y1, bb.z0); t.vertex(bb.x0, bb.y1, bb.z0);
t.vertex(bb.x0, bb.y0, bb.z0); t.vertex(bb.x0, bb.y0, bb.z0);
//t.normal(1, 0, 0); t.normal(1, 0, 0);
t.vertex(bb.x1, bb.y0, bb.z0); t.vertex(bb.x1, bb.y0, bb.z0);
t.vertex(bb.x1, bb.y1, bb.z0); t.vertex(bb.x1, bb.y1, bb.z0);
t.vertex(bb.x1, bb.y1, bb.z1); t.vertex(bb.x1, bb.y1, bb.z1);
@@ -116,134 +122,139 @@ Font* EntityRenderer::getFont() {
return entityRenderDispatcher->getFont(); return entityRenderDispatcher->getFont();
} }
//void postRender(Entity entity, float x, float y, float z, float rot, float a) { void EntityRenderer::postRender(Entity* entity, float x, float y, float z, float rot, float a) {
// if (entityRenderDispatcher.options.fancyGraphics && shadowRadius > 0) { if (/*entityRenderDispatcher.options.fancyGraphics &&*/entityRenderDispatcher->minecraft->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS) && shadowRadius > 0) {
// float dist = entityRenderDispatcher.distanceToSqr(entity.x, entity.y, entity.z); float dist = entityRenderDispatcher->distanceToSqr(entity->x, entity->y, entity->z);
// float pow = (float) ((1 - dist / (16.0f * 16.0f)) * shadowStrength); float pow = (float) ((1 - dist / (16.0f * 16.0f)) * shadowStrength);
// if (pow > 0) { if (pow > 0) {
// renderShadow(entity, x, y, z, pow, a); renderShadow(entity, x, y, z, pow, a);
// } }
// } //}
// if (entity.isOnFire()) renderFlame(entity, x, y, z, a); if (entity->isOnFire()) renderFlame(entity, x, y, z, a);
//} }
}
void EntityRenderer::renderFlame(Entity* e, float x, float y, float z, float a) {
//void renderFlame(Entity e, float x, float y, float z, float a) { int tex = ((Tile*)Tile::fire)->tex;
// glDisable2(GL_LIGHTING);
// int tex = Tile.fire.tex;
// int xt = (tex & 0xf) << 4; int xt = (tex & 0xf) << 4;
// int yt = tex & 0xf0; int yt = tex & 0xf0;
// float u0 = (xt) / 256.0f; float u0 = (xt) / 256.0f;
// float u1 = (xt + 15.99f) / 256.0f; float u1 = (xt + 15.99f) / 256.0f;
// float v0 = (yt) / 256.0f; float v0 = (yt) / 256.0f;
// float v1 = (yt + 15.99f) / 256.0f; float v1 = (yt + 15.99f) / 256.0f;
// glPushMatrix2(); glPushMatrix2();
// glTranslatef2((float) x, (float) y, (float) z); glTranslatef2((float) x, (float) y, (float) z);
// float s = e.bbWidth * 1.4f; float s = e->bbWidth * 1.4f;
// glScalef2(s, s, s); glScalef2(s, s, s);
// bindTexture("terrain.png"); bindTexture("terrain.png");
// Tesselator t = Tesselator.instance; Tesselator& t = Tesselator::instance;
// float r = 1.0f; float r = 1.0f;
// float xo = 0.5f; float xo = 0.5f;
// float yo = 0.0f; float yo = 0.0f;
// float h = e.bbHeight / e.bbWidth; float h = e->bbHeight / e->bbWidth;
// glRotatef2(-entityRenderDispatcher.playerRotY, 0, 1, 0); glRotatef2(-entityRenderDispatcher->playerRotY, 0, 1, 0);
// glTranslatef2(0, 0, -0.4f + ((int) h) * 0.02f); glTranslatef2(0, 0, -0.4f + ((int) h) * 0.02f);
// glColor4f2(1, 1, 1, 1); glColor4f2(1, 1, 1, 1);
// // glRotatef2(-playerRotX, 1, 0, 0); // glRotatef2(-playerRotX, 1, 0, 0);
// t.begin(); t.begin();
// while (h > 0) { while (h > 0) {
// t.vertexUV(r - xo, 0 - yo, 0, u1, v1); t.vertexUV(r - xo, 0 - yo, 0, u1, v1);
// t.vertexUV(0 - xo, 0 - yo, 0, u0, v1); t.vertexUV(0 - xo, 0 - yo, 0, u0, v1);
// t.vertexUV(0 - xo, 1.4f - yo, 0, u0, v0); t.vertexUV(0 - xo, 1.4f - yo, 0, u0, v0);
// t.vertexUV(r - xo, 1.4f - yo, 0, u1, v0); t.vertexUV(r - xo, 1.4f - yo, 0, u1, v0);
// h -= 1; h -= 1;
// yo -= 1; yo -= 1;
// r *= 0.9f; r *= 0.9f;
// glTranslatef2(0, 0, -0.04f); glTranslatef2(0, 0, -0.04f);
// } }
// t.end(); t.draw();
// glPopMatrix2(); glPopMatrix2();
// glEnable2(GL_LIGHTING); // glEnable2(GL_LIGHTING);
//} }
//void renderShadow(Entity e, float x, float y, float z, float pow, float a) { void EntityRenderer::renderShadow(Entity* e, float x, float y, float z, float pow, float a) { //
// glEnable2(GL_BLEND); glEnable2(GL_BLEND);
// glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Textures textures = entityRenderDispatcher.textures; //Textures* textures = entityRenderDispatcher->textures;
// textures.bind(textures.loadTexture("%clamp%/misc/shadow.png")); //textures->bind(textures->loadTexture("%clamp%/environment/shadow.png"));
Textures* textures = entityRenderDispatcher->textures;
textures->bind(textures->loadTexture("/misc/shadow.png"));
// Level level = getLevel(); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// glDepthMask(false); Level* level = getLevel();
// float r = shadowRadius;
// float ex = e.xOld + (e.x - e.xOld) * a; glDepthMask(false);
// float ey = e.yOld + (e.y - e.yOld) * a + e.getShadowHeightOffs(); float r = shadowRadius;
// float ez = e.zOld + (e.z - e.zOld) * a;
// int x0 = Mth.floor(ex - r); float ex = e->xOld + (e->x - e->xOld) * a;
// int x1 = Mth.floor(ex + r); float ey = e->yOld + (e->y - e->yOld) * a + e->getShadowHeightOffs();
// int y0 = Mth.floor(ey - r); float ez = e->zOld + (e->z - e->zOld) * a;
// int y1 = Mth.floor(ey);
// int z0 = Mth.floor(ez - r);
// int z1 = Mth.floor(ez + r);
// float xo = x - ex; int x0 = Mth::floor(ex - r);
// float yo = y - ey; int x1 = Mth::floor(ex + r);
// float zo = z - ez; int y0 = Mth::floor(ey - r);
int y1 = Mth::floor(ey);
int z0 = Mth::floor(ez - r);
int z1 = Mth::floor(ez + r);
// Tesselator tt = Tesselator.instance; float xo = x - ex;
// tt.begin(); float yo = y - ey;
// for (int xt = x0; xt <= x1; xt++) float zo = z - ez;
// for (int yt = y0; yt <= y1; yt++)
// for (int zt = z0; zt <= z1; zt++) {
// int t = level.getTile(xt, yt - 1, zt);
// if (t > 0 && level.getRawBrightness(xt, yt, zt) > 3) {
// renderTileShadow(Tile.tiles[t], x, y + e.getShadowHeightOffs(), z, xt, yt, zt, pow, r, xo, yo + e.getShadowHeightOffs(), zo);
// }
// }
// tt.end();
// glColor4f2(1, 1, 1, 1); Tesselator& tt = Tesselator::instance;
// glDisable2(GL_BLEND); tt.begin();
// glDepthMask(true); for (int xt = x0; xt <= x1; xt++)
//} for (int yt = y0; yt <= y1; yt++)
for (int zt = z0; zt <= z1; zt++) {
int t = level->getTile(xt, yt - 1, zt);
if (t > 0 && level->getRawBrightness(xt, yt, zt) > 3) {
renderTileShadow(Tile::tiles[t], x, y + e->getShadowHeightOffs(), z, xt, yt, zt, pow, r, xo, yo + e->getShadowHeightOffs(), zo);
}
}
tt.draw();
//Level* getLevel() { glColor4f2(1, 1, 1, 1);
// return entityRenderDispatcher.level; glDisable2(GL_BLEND);
//} glDepthMask(true);
}
//void renderTileShadow(Tile tt, float x, float y, float z, int xt, int yt, int zt, float pow, float r, float xo, float yo, float zo) { Level* EntityRenderer::getLevel() {
// Tesselator t = Tesselator.instance; return entityRenderDispatcher->level;
// if (!tt.isCubeShaped()) return; }
// float a = ((pow - (y - (yt + yo)) / 2) * 0.5f) * getLevel().getBrightness(xt, yt, zt); void EntityRenderer::renderTileShadow(Tile* tt, float x, float y, float z, int xt, int yt, int zt, float pow, float r, float xo, float yo, float zo) {
// if (a < 0) return; Tesselator& t = Tesselator::instance;
// if (a > 1) a = 1; if (!tt->isCubeShaped()) return;
// t.color(1, 1, 1, (float) a);
// // glColor4f2(1, 1, 1, (float) a);
// float x0 = xt + tt.xx0 + xo; float a = ((pow - (y - (yt + yo)) / 2) * 0.5f) * getLevel()->getBrightness(xt, yt, zt);
// float x1 = xt + tt.xx1 + xo; if (a < 0) return;
// float y0 = yt + tt.yy0 + yo + 1.0 / 64.0f; if (a > 1) a = 1;
// float z0 = zt + tt.zz0 + zo; // t.color(1, 1, 1, (float) a);
// float z1 = zt + tt.zz1 + zo; glColor4f2(1, 1, 1, (float) a);
// float u0 = (float) ((x - (x0)) / 2 / r + 0.5f); float x0 = xt + tt->xx0 + xo;
// float u1 = (float) ((x - (x1)) / 2 / r + 0.5f); float x1 = xt + tt->xx1 + xo;
// float v0 = (float) ((z - (z0)) / 2 / r + 0.5f); float y0 = yt + tt->yy0 + yo + 1.0 / 64.0f;
// float v1 = (float) ((z - (z1)) / 2 / r + 0.5f); float z0 = zt + tt->zz0 + zo;
float z1 = zt + tt->zz1 + zo;
// t.vertexUV(x0, y0, z0, u0, v0); float u0 = (float) ((x - (x0)) / 2 / r + 0.5f);
// t.vertexUV(x0, y0, z1, u0, v1); float u1 = (float) ((x - (x1)) / 2 / r + 0.5f);
// t.vertexUV(x1, y0, z1, u1, v1); float v0 = (float) ((z - (z0)) / 2 / r + 0.5f);
// t.vertexUV(x1, y0, z0, u1, v0); float v1 = (float) ((z - (z1)) / 2 / r + 0.5f);
//}
t.vertexUV(x0, y0, z0, u0, v0);
t.vertexUV(x0, y0, z1, u0, v1);
t.vertexUV(x1, y0, z1, u1, v1);
t.vertexUV(x1, y0, z0, u1, v0);
}

View File

@@ -12,6 +12,8 @@ class EntityRenderDispatcher;
class Entity; class Entity;
class AABB; class AABB;
class Font; class Font;
class Tile;
class Level;
class EntityRenderer class EntityRenderer
{ {
@@ -24,6 +26,11 @@ public:
virtual void render(Entity* entity, float x, float y, float z, float rot, float a) = 0; virtual void render(Entity* entity, float x, float y, float z, float rot, float a) = 0;
static void render(const AABB& bb, float xo, float yo, float zo); static void render(const AABB& bb, float xo, float yo, float zo);
static void renderFlat(const AABB& bb); static void renderFlat(const AABB& bb);
void renderShadow(Entity* e, float x, float y, float z, float pow, float a);
void renderTileShadow(Tile* tt, float x, float y, float z, int xt, int yt, int zt, float pow, float r, float xo, float yo, float zo);
void renderFlame(Entity* e, float x, float y, float z, float a);
void postRender(Entity* entity, float x, float y, float z, float rot, float a);
Level* getLevel();
Font* getFont(); Font* getFont();

View File

@@ -226,7 +226,42 @@ void ItemRenderer::renderGuiItem(Font* font, Textures* textures, const ItemInsta
t.draw(); t.draw();
} }
void ItemRenderer::renderGuiItemDecorations(const ItemInstance* item, float x, float y) {
void ItemRenderer::renderGuiItemDecorations(Font* font, Textures* textures, ItemInstance* item, int x, int y){ // this is normally unused in the header but i ported it from java beta - shredder
if (item != NULL) {
if (item->count > 1) {
char buf[16];
sprintf(buf, "%d", item->count);
std::string countStr = buf;
// glDisable(GL_LIGHTING);
// glDisable(GL_DEPTH_TEST);
font->drawShadow(countStr, x + 19 - 2 - font->width(countStr),
y + 6 + 3, 0xFFFFFF);
// glEnable(GL_LIGHTING);
// glEnable(GL_DEPTH_TEST);
}
if (item->isDamaged()) {
float p = std::floor(13.5f - (float) item->getDamageValue() * 13.0f / (float) item->getMaxDamage() + 0.5);
int cc = (int) std::floor(255.5f - (float) item->getDamageValue() * 255.0f / (float) item->getMaxDamage() + 0.5);
// glDisable(GL_LIGHTING);
// glDisable(GL_DEPTH_TEST);
// glDisable(GL_TEXTURE_2D);
// auto var8 = ::net::minecraft::client::renderer::Tesselator::instance();
Tesselator& t = Tesselator::instance;
int ca = ((255 - cc)<< 16 | (cc << 8));
int cb = (((255 - cc) / 4) << 16 | 16128);
fillRect(t, x + 2, y + 13, 13, 2, 0);
fillRect(t, x + 2, y + 13, 12, 1, cb);
fillRect(t, x + 2, y + 13, p, 1, ca);
// glEnable(GL_TEXTURE_2D);
// glEnable(GL_LIGHTING);
// glEnable(GL_DEPTH_TEST);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
}
}
}
void ItemRenderer::renderGuiItemDecorations(const ItemInstance* item, float x, float y) { // nothing changed here this is the normal pocket edition one.
if (!item) return; if (!item) return;
if (item->count > 0 && item->isDamaged()) { if (item->count > 0 && item->isDamaged()) {
float p = std::floor(13.5f - (float) item->getDamageValue() * 13.0f / (float) item->getMaxDamage()); float p = std::floor(13.5f - (float) item->getDamageValue() * 13.0f / (float) item->getMaxDamage());

View File

@@ -22,7 +22,7 @@ public:
static void renderGuiItem(Font* font, Textures* textures, const ItemInstance* item, float x, float y, bool fancy); static void renderGuiItem(Font* font, Textures* textures, const ItemInstance* item, float x, float y, bool fancy);
static void renderGuiItem(Font* font, Textures* textures, const ItemInstance* item, float x, float y, float w, float h, bool fancy); static void renderGuiItem(Font* font, Textures* textures, const ItemInstance* item, float x, float y, float w, float h, bool fancy);
static void renderGuiItemCorrect(Font* font, Textures* textures, const ItemInstance* item, int x, int y); static void renderGuiItemCorrect(Font* font, Textures* textures, const ItemInstance* item, int x, int y);
//void renderGuiItemDecorations(Font* font, Textures* textures, ItemInstance* item, int x, int y); static void renderGuiItemDecorations(Font* font, Textures* textures, ItemInstance* item, int x, int y);
static void renderGuiItemDecorations(const ItemInstance* item, float x, float y); static void renderGuiItemDecorations(const ItemInstance* item, float x, float y);
static void blit(float x, float y, float sx, float sy, float w, float h); static void blit(float x, float y, float sx, float sy, float w, float h);

View File

@@ -135,7 +135,7 @@ void MobRenderer::render(Entity* e, float x, float y, float z, float rot, float
//glEnable2(GL_DEPTH_TEST); //glEnable2(GL_DEPTH_TEST);
glPopMatrix2(); glPopMatrix2();
postRender(mob, x, y, z, rot, a);
renderName(mob, x, y, z); renderName(mob, x, y, z);
} }

View File

@@ -206,3 +206,93 @@ void WaterSideTexture::tick() {
pixels[i * 4 + 3] = a; pixels[i * 4 + 3] = a;
} }
} }
FireTexture::FireTexture()
: super(((Tile*)Tile::fire)->tex),
_tick(0),
_frame(0)
{
current = new float[16*20];
next = new float[16*20];
heat = new float[16*20];
heata = new float[16*20];
for (int i = 0; i < 256; ++i) {
current[i] = 0;
next[i] = 0;
heat[i] = 0;
heata[i] = 0;
}
}
FireTexture::~FireTexture() {
delete[] current;
delete[] next;
delete[] heat;
delete[] heata;
}
// oh boy time to implement fire textures, i am so fucked - shredder
void FireTexture::tick() {
// loop generates fire texture on the empty texture grid, hopefully shouldnt be too taxing on older hardware - shredder
for (int x = 0; x < 16; x++) {
for (int y = 0; y < 20; y++) {
int count = 18;
float pow = this->current[x + (y + 1) % 20 * 16] * (float)(count);
for (int xx = x - 1; xx <= x + 1; xx++) {
for (int yy = y; yy <= y + 1; yy++) {
if (xx >= 0 && yy >= 0 && xx < 16 && yy < 20) {
pow += this->current[xx + yy * 16];
}
count++;
}
}
this->next[x + y * 16] = pow / (float(count) * 1.06f);
if (y >= 19) {
this->next[x + y * 16] = float(Mth::random() * Mth::random() * Mth::random() * 4.0 + Mth::random() * 0.1f + 0.2f);
}
}
}
// hopefully this doesn't cause any mysterious issues - shredder
float* tmp = next;
next = current;
current = tmp;
for (int i = 0; i < 256; i++) {
float pow = this->current[i] * 1.8f;
if (pow > 1.0f) {
pow = 1.0f;
}
if (pow < 0.0f) {
pow = 0.0f;
}
int r = (int) (pow * 155.0f + 100.0f);
int g = (int)(pow * pow * 255.0f);
int b = (int)(pow * pow * pow * pow * pow * pow * pow * pow * pow * pow * 255.0f);
int a = 255;
if (pow < 0.5f) {
a = 0;
}
// @TODO: cant be arsed rn to implement the anaglyph3d check would be nice to check if it does - shredder
//if (this->anaglyph3d) {
// float rr = (r * 30 + g * 59 + b * 11) / 100;
// float gg = (r * 30 + g * 70) / 100;
// float bb = (r * 30 + b * 70) / 100;
// r = rr;
// g = gg;
// b = bb;
//}
pixels[i * 4 + 0] = r;
pixels[i * 4 + 1] = g;
pixels[i * 4 + 2] = b;
pixels[i * 4 + 3] = a;
}
}

View File

@@ -56,4 +56,21 @@ public:
void tick(); void tick();
}; };
class FireTexture: public DynamicTexture
{
typedef DynamicTexture super;
int _tick;
int _frame;
float* current;
float* next;
float* heat;
float* heata;
public:
FireTexture();
~FireTexture();
void tick();
};
#endif /*NET_MINECRAFT_CLIENT_RENDERER_PTEXTURE__DynamicTexture_H__*/ #endif /*NET_MINECRAFT_CLIENT_RENDERER_PTEXTURE__DynamicTexture_H__*/

98
src/util/Color.cpp Normal file
View File

@@ -0,0 +1,98 @@
#include "Mth.h"
#include "Color.h"
#include <cassert>
//Creates an opaque sRGB color with the specified red, green, and blue values in the range (0.0 - 1.0).
//Alpha is defaulted to 1.0. The actual color used in rendering depends on finding the best match given the color space
//available for a particular output device.
//Parameters:
//r - the red component
//g - the green component
//b - the blue component
//Throws:
//IllegalArgumentException - if r, g or b are outside of the range 0.0 to 1.0, inclusive
Color::Color( float r, float g, float b)
{
assert( r >= 0.0f && r <= 1.0f );
assert( g >= 0.0f && g <= 1.0f );
assert( b >= 0.0f && b <= 1.0f );
//argb
colour = ( (0xFF<<24) | ( (int)(r*255)<<16 ) | ( (int)(g*255)<<8 ) | ( (int)(b*255) ) );
}
Color::Color( int r, int g, int b)
{
colour = ( (0xFF<<24) | ( (r&0xff)<<16 ) | ( (g&0xff)<<8 ) | ( (b&0xff) ) );
}
//Creates a Color object based on the specified values for the HSB color model.
//The s and b components should be floating-point values between zero and one (numbers in the range 0.0-1.0).
//The h component can be any floating-point number. The floor of this number is subtracted from it to create a fraction between 0 and 1.
//This fractional number is then multiplied by 360 to produce the hue angle in the HSB color model.
//
//Parameters:
//h - the hue component
//s - the saturation of the color
//b - the brightness of the color
//Returns:
//a Color object with the specified hue, saturation, and brightness.
Color Color::getHSBColor(float hue, float saturation, float brightness)
{
int r = 0, g = 0, b = 0;
if (saturation == 0)
{
r = g = b = (int) (brightness * 255.0f + 0.5f);
}
else
{
float h = (hue - (float)Mth::floor(hue)) * 6.0f;
float f = h - (float)Mth::floor(h);
float p = brightness * (1.0f - saturation);
float q = brightness * (1.0f - saturation * f);
float t = brightness * (1.0f - (saturation * (1.0f - f)));
switch ((int) h)
{
case 0:
r = (int) (brightness * 255.0f + 0.5f);
g = (int) (t * 255.0f + 0.5f);
b = (int) (p * 255.0f + 0.5f);
break;
case 1:
r = (int) (q * 255.0f + 0.5f);
g = (int) (brightness * 255.0f + 0.5f);
b = (int) (p * 255.0f + 0.5f);
break;
case 2:
r = (int) (p * 255.0f + 0.5f);
g = (int) (brightness * 255.0f + 0.5f);
b = (int) (t * 255.0f + 0.5f);
break;
case 3:
r = (int) (p * 255.0f + 0.5f);
g = (int) (q * 255.0f + 0.5f);
b = (int) (brightness * 255.0f + 0.5f);
break;
case 4:
r = (int) (t * 255.0f + 0.5f);
g = (int) (p * 255.0f + 0.5f);
b = (int) (brightness * 255.0f + 0.5f);
break;
case 5:
r = (int) (brightness * 255.0f + 0.5f);
g = (int) (p * 255.0f + 0.5f);
b = (int) (q * 255.0f + 0.5f);
break;
}
}
return Color( r, g, b );
}
int Color::getRGB()
{
return colour;
}

15
src/util/Color.h Normal file
View File

@@ -0,0 +1,15 @@
#pragma once
class Color
{
private:
int colour;
public:
//Creates an opaque sRGB color with the specified red, green, and blue values in the range (0.0 - 1.0).
Color( float r, float g, float b);
Color( int r, int g, int b);
static Color getHSBColor(float h, float s, float b);
int getRGB();
};

View File

@@ -245,6 +245,7 @@ void Inventory::setupDefault() {
addItem(new ItemInstance(Item::seeds_melon)); addItem(new ItemInstance(Item::seeds_melon));
addItem(new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE)); addItem(new ItemInstance(Item::dye_powder, 1, DyePowderItem::WHITE));
addItem(new ItemInstance(Item::hoe_iron)); addItem(new ItemInstance(Item::hoe_iron));
addItem(new ItemInstance(Item::flintAndSteel));
#ifdef RPI #ifdef RPI
Sel[0] = addItem(new ItemInstance(Item::sword_iron)); Sel[0] = addItem(new ItemInstance(Item::sword_iron));
#else #else

View File

@@ -19,7 +19,7 @@ public:
setMaxDamage(64); setMaxDamage(64);
} }
/*
bool useOn(ItemInstance* instance, Player* player, Level* level, int x, int y, int z, int face, float clickX, float clickY, float clickZ) { bool useOn(ItemInstance* instance, Player* player, Level* level, int x, int y, int z, int face, float clickX, float clickY, float clickZ) {
if (face == 0) y--; if (face == 0) y--;
if (face == 1) y++; if (face == 1) y++;
@@ -30,14 +30,14 @@ public:
int targetType = level->getTile(x, y, z); int targetType = level->getTile(x, y, z);
if (targetType == 0) { if (targetType == 0) {
level->playSound(x + 0.5, y + 0.5, z + 0.5, "fire.ignite", 1, sharedRandom.nextFloat() * 0.4f + 0.8f); level->playSound(x + 0.5, y + 0.5, z + 0.5, "fire.ignite", 1, random.nextFloat() * 0.4f + 0.8f);
level->setTile(x, y, z, Tile::fire->id); level->setTile(x, y, z, ((Tile*)Tile::fire)->id);
} }
instance->hurt(1); instance->hurt(1);
return true; return true;
} }
*/
}; };
#endif /*NET_MINECRAFT_WORLD_ITEM__FlintAndSteelItem_H__*/ #endif /*NET_MINECRAFT_WORLD_ITEM__FlintAndSteelItem_H__*/

View File

@@ -0,0 +1,13 @@
#include "FoliageColor.h"
// TODO: Probably move all the stuff from the header into here so it's a bit cleaner
bool FoliageColor::useTint = true;
int FoliageColor::get(float temp, float rain) {
rain *= temp;
int x = (int) ((1 - temp) * 255);
int y = (int) ((1 - rain) * 255);
return pixels[y << 8 | x];
}
int* FoliageColor::pixels = nullptr;

View File

@@ -6,16 +6,33 @@
class FoliageColor class FoliageColor
{ {
public: public:
// static void init(int[] pixels) { static bool useTint;
// FoliageColor::pixels = pixels;
// } static void setUseTint(bool value) {
// useTint = value;
// static int get(float temp, float rain) { }
// rain *= temp; /*
// int x = (int) ((1 - temp) * 255); Shredder here, Ive converted the unused commented out code into their correct syntax, though if i did something incorrectly feel free to take reference from the
// int y = (int) ((1 - rain) * 255); commented out code
// return pixels[y << 8 | x]; */
// }
// static void init(int[] pixels) {
// FoliageColor::pixels = pixels;
// }
//
// static int get(float temp, float rain) {
// rain *= temp;
// int x = (int) ((1 - temp) * 255);
// int y = (int) ((1 - rain) * 255);
// return pixels[y << 8 | x];
// }
static void init(int* p) {
pixels = p;
}
static int get(float temp, float rain);
static int getEvergreenColor() { static int getEvergreenColor() {
return 0x619961; return 0x619961;
@@ -26,11 +43,12 @@ public:
} }
static int getDefaultColor() { static int getDefaultColor() {
return 0x48b518; return 0xFFFFFF;
} }
private: private:
//static int pixels[256*256]; // static int pixels[256*256];
static int* pixels;
}; };
#endif /*NET_MINECRAFT_WORLD_LEVEL__FoliageColor_H__*/ #endif /*NET_MINECRAFT_WORLD_LEVEL__FoliageColor_H__*/

View File

@@ -0,0 +1,13 @@
#include "GrassColor.h"
// TODO: Probably move all the stuff from the header into here so it's a bit cleaner
bool GrassColor::useTint = true;
int GrassColor::get(float temp, float rain) {
rain *= temp;
int x = (int) ((1 - temp) * 255);
int y = (int) ((1 - rain) * 255);
return pixels[y << 8 | x];
}
int* GrassColor::pixels = nullptr;

View File

@@ -0,0 +1,42 @@
#ifndef NET_MINECRAFT_WORLD_LEVEL__GrassColor_H__
#define NET_MINECRAFT_WORLD_LEVEL__GrassColor_H__
//package net.minecraft.world.level;
class GrassColor
{
public:
static bool useTint;
static void setUseTint(bool value) {
useTint = value;
}
/*
Shredder here, Ive converted the unused commented out code into their correct syntax, though if i did something incorrectly feel free to take reference from the
commented out code
*/
// static void init(int[] pixels) {
// GrassColor::pixels = pixels;
// }
//
// static int get(float temp, float rain) {
// rain *= temp;
// int x = (int) ((1 - temp) * 255);
// int y = (int) ((1 - rain) * 255);
// return pixels[y << 8 | x];
// }
static void init(int* p) {
pixels = p;
}
static int get(float temp, float rain);
private:
// static int pixels[256*256];
static int* pixels;
};
#endif /*NET_MINECRAFT_WORLD_LEVEL__GrassColor_H__*/

View File

@@ -30,7 +30,7 @@
#include "../../network/packet/ExplodePacket.h" #include "../../network/packet/ExplodePacket.h"
Level::Level(LevelStorage* levelStorage, const std::string& levelName, const LevelSettings& settings, int generatorVersion, Dimension* fixedDimension /* = NULL */) Level::Level(LevelStorage* levelStorage, const std::string& levelName, const LevelSettings& settings, int generatorVersion, Dimension* fixedDimension /* = NULL */)
: levelStorage(levelStorage), : levelStorage(levelStorage),
isClientSide(false), isClientSide(false),
isFindingSpawn(false), isFindingSpawn(false),
noNeighborUpdate(false), noNeighborUpdate(false),
@@ -1176,10 +1176,20 @@ Vec3 Level::getSkyColor(Entity* source, float a) {
if (br < 0.0f) br = 0.0f; if (br < 0.0f) br = 0.0f;
if (br > 0.75f) br = 0.75f; //@note; was 1.0f if (br > 0.75f) br = 0.75f; //@note; was 1.0f
// int xx = Mth::floor(source->x); int xx = Mth::floor(source->x);
// int zz = Mth::floor(source->z); int zz = Mth::floor(source->z);
// float temp = 0.5;//(float) getBiomeSource().getTemperature(xx, zz); // float temp = 0.5;//(float) getBiomeSource().getTemperature(xx, zz); // unused in normal pe too, just hardcoded temp values for some reason.
int skyColor = 0x3070ff;//getBiomeSource().getBiome(xx, zz).getSkyColor(temp); float temp = (float) getBiomeSource()->getTemperature(xx, zz);
int skyColor;
if (dimension->FogType == 1){ // 1 is java styled fog which should use temperatures!
skyColor = getBiomeSource()->getBiome(xx, zz)->getSkyColor(temp);
}
else { // otherwise default to the normal pocket edition skycolor
skyColor = 0x3070ff;
}
// int skyColor = 0x3070ff;//getBiomeSource().getBiome(xx, zz).getSkyColor(temp); // This is the vanilla way, add it as OPTION_SKY - shredder
float r = ((skyColor >> 16) & 0xff) / 255.0f; float r = ((skyColor >> 16) & 0xff) / 255.0f;
float g = ((skyColor >> 8) & 0xff) / 255.0f; float g = ((skyColor >> 8) & 0xff) / 255.0f;
@@ -1599,8 +1609,8 @@ bool Level::containsFireTile(const AABB& box) {
for (int z = z0; z < z1; z++) { for (int z = z0; z < z1; z++) {
int t = getTile(x, y, z); int t = getTile(x, y, z);
if (/*t == ((Tile*)(Tile::fire))->id if (t == ((Tile*)(Tile::fire))->id
||*/ t == Tile::lava->id || t == Tile::lava->id
|| t == Tile::calmLava->id) { || t == Tile::calmLava->id) {
return true; return true;
} }
@@ -1943,10 +1953,10 @@ const EntityList& Level::getAllEntities() {
// //
/* /*
void Level::addEntities(const EntityList& list) { void Level::addEntities(const EntityList& list) {
entities.insert(entities.end(), list.begin(), list.end()); entities.insert(entities.end(), list.begin(), list.end());
for (int j = 0; j < (int)list.size(); j++) { for (int j = 0; j < (int)list.size(); j++) {
entityAdded(list[j]); entityAdded(list[j]);
} }
} }
*/ */
@@ -2042,18 +2052,18 @@ void Level::setSpawnPos(Pos spawnPos) {
/* /*
void Level::ensureAdded(Entity* entity) { void Level::ensureAdded(Entity* entity) {
int xc = Mth::floor(entity->x / 16); int xc = Mth::floor(entity->x / 16);
int zc = Mth::floor(entity->z / 16); int zc = Mth::floor(entity->z / 16);
int r = 2; int r = 2;
for (int x = xc - r; x <= xc + r; x++) { for (int x = xc - r; x <= xc + r; x++) {
for (int z = zc - r; z <= zc + r; z++) { for (int z = zc - r; z <= zc + r; z++) {
this->getChunk(x, z); this->getChunk(x, z);
} }
} }
if (std::find(entities.begin(), entities.end(), entity) == entities.end()) { if (std::find(entities.begin(), entities.end(), entity) == entities.end()) {
entities.push_back(entity); entities.push_back(entity);
} }
} }
*/ */
@@ -2070,35 +2080,35 @@ void Level::broadcastEntityEvent(Entity* e, char eventId) {
/* /*
void Level::removeAllPendingEntityRemovals() { void Level::removeAllPendingEntityRemovals() {
//Util::removeAll(entities, _entitiesToRemove); //Util::removeAll(entities, _entitiesToRemove);
// //entities.removeAll(entitiesToRemove); // //entities.removeAll(entitiesToRemove);
// for (int j = 0; j < (int)_entitiesToRemove.size(); j++) { // for (int j = 0; j < (int)_entitiesToRemove.size(); j++) {
// Entity* e = _entitiesToRemove[j]; // Entity* e = _entitiesToRemove[j];
// int xc = e->xChunk; // int xc = e->xChunk;
// int zc = e->zChunk; // int zc = e->zChunk;
// if (e->inChunk && hasChunk(xc, zc)) { // if (e->inChunk && hasChunk(xc, zc)) {
// getChunk(xc, zc)->removeEntity(e); // getChunk(xc, zc)->removeEntity(e);
// } // }
// } // }
// for (unsigned int j = 0; j < _entitiesToRemove.size(); j++) { // for (unsigned int j = 0; j < _entitiesToRemove.size(); j++) {
// entityRemoved(_entitiesToRemove[j]); // entityRemoved(_entitiesToRemove[j]);
// } // }
// _entitiesToRemove.clear(); // _entitiesToRemove.clear();
for (unsigned int i = 0; i < entities.size(); i++) { for (unsigned int i = 0; i < entities.size(); i++) {
Entity* e = entities[i]; Entity* e = entities[i];
if (e->removed) { if (e->removed) {
int xc = e->xChunk; int xc = e->xChunk;
int zc = e->zChunk; int zc = e->zChunk;
if (e->inChunk && hasChunk(xc, zc)) { if (e->inChunk && hasChunk(xc, zc)) {
getChunk(xc, zc)->removeEntity(e); getChunk(xc, zc)->removeEntity(e);
} }
entities.erase( entities.begin() + (i--) ); entities.erase( entities.begin() + (i--) );
entityRemoved(e); entityRemoved(e);
} }
} }
} }
*/ */
@@ -2231,7 +2241,7 @@ bool Level::inRange( int x, int y, int z ) {
// AdventureSettings // AdventureSettings
// //
AdventureSettings::AdventureSettings() AdventureSettings::AdventureSettings()
: doTickTime(true), : doTickTime(true),
noPvP(false), noPvP(false),
noPvM(false), noPvM(false),
noMvP(false), noMvP(false),

View File

@@ -3,8 +3,9 @@
//package net.minecraft.world.level; //package net.minecraft.world.level;
/*
class BiomeSource; class BiomeSource;
/*
class TileEntity; class TileEntity;
*/ */
class Material; class Material;
@@ -29,7 +30,7 @@ public:
virtual bool isSolidRenderTile(int x, int i, int z) = 0; virtual bool isSolidRenderTile(int x, int i, int z) = 0;
virtual bool isSolidBlockingTile(int x, int i, int z) = 0; virtual bool isSolidBlockingTile(int x, int i, int z) = 0;
//virtual BiomeSource* getBiomeSource() = 0; virtual BiomeSource* getBiomeSource() = 0;
virtual Biome* getBiome(int x, int z) = 0; virtual Biome* getBiome(int x, int z) = 0;
}; };

View File

@@ -4,6 +4,7 @@
#include "tile/Tile.h" #include "tile/Tile.h"
#include "Level.h" #include "Level.h"
Region::Region(Level* level, int x1, int y1, int z1, int x2, int y2, int z2) { Region::Region(Level* level, int x1, int y1, int z1, int x2, int y2, int z2) {
this->level = level; this->level = level;
@@ -135,6 +136,6 @@ Biome* Region::getBiome( int x, int z ) {
return level->getBiome(x, z); return level->getBiome(x, z);
} }
//BiomeSource getBiomeSource() { BiomeSource* Region::getBiomeSource() {
// return level.getBiomeSource(); return level->getBiomeSource();
//} }

View File

@@ -5,6 +5,7 @@
#include "LevelSource.h" #include "LevelSource.h"
class Level; class Level;
class Material; class Material;
class LevelChunk; class LevelChunk;
@@ -27,6 +28,7 @@ public:
int getData(int x, int y, int z); int getData(int x, int y, int z);
const Material* getMaterial(int x, int y, int z); const Material* getMaterial(int x, int y, int z);
Biome* getBiome(int x, int z); Biome* getBiome(int x, int z);
BiomeSource* getBiomeSource() override;
private: private:
int xc1, zc1; int xc1, zc1;
LevelChunk*** chunks; LevelChunk*** chunks;

View File

@@ -2,11 +2,14 @@
#include "../levelgen/feature/TreeFeature.h" #include "../levelgen/feature/TreeFeature.h"
#include "../levelgen/feature/TallgrassFeature.h" #include "../levelgen/feature/TallgrassFeature.h"
#include "../levelgen/feature/BasicTree.h"
#include "../../entity/EntityTypes.h" #include "../../entity/EntityTypes.h"
#include "../../entity/MobCategory.h" #include "../../entity/MobCategory.h"
#include "../../level/tile/TallGrass.h" #include "../../level/tile/TallGrass.h"
#include "../../../util/Color.h"
Biome* Biome::rainForest = NULL; Biome* Biome::rainForest = NULL;
Biome* Biome::swampland = NULL; Biome* Biome::swampland = NULL;
Biome* Biome::seasonalForest = NULL; Biome* Biome::seasonalForest = NULL;
@@ -140,7 +143,7 @@ void Biome::teardownBiomes() {
Feature* Biome::getTreeFeature( Random* random ) Feature* Biome::getTreeFeature( Random* random )
{ {
if (random->nextInt(10) == 0) { if (random->nextInt(10) == 0) {
//return /*new*/ BasicTree(); return new BasicTree(false);
} }
return new TreeFeature(false); return new TreeFeature(false);
} }
@@ -148,6 +151,9 @@ Feature* Biome::getGrassFeature( Random* random ) {
return new TallgrassFeature(Tile::tallgrass->id, TallGrass::TALL_GRASS); return new TallgrassFeature(Tile::tallgrass->id, TallGrass::TALL_GRASS);
} }
Biome* Biome::getBiome( float temperature, float downfall ) Biome* Biome::getBiome( float temperature, float downfall )
{ {
int a = (int) (temperature * 63); int a = (int) (temperature * 63);
@@ -204,11 +210,11 @@ float Biome::adjustDepth( float depth )
int Biome::getSkyColor( float temp ) int Biome::getSkyColor( float temp )
{ {
// temp /= 3.f; temp /= 3.f;
// if (temp < -1) temp = -1; if (temp < -1) temp = -1;
// if (temp > 1) temp = 1; if (temp > 1) temp = 1;
return 0x80808080; // return 0x80808080;This is the vanilla way, add it as OPTION_SKY or leave it like this bcus this function literally never gets used anyways if level has vanilla sky color - shredder
//return Color.getHSBColor(224 / 360.0f - temp * 0.05f, 0.50f + temp * 0.1f, 1.0f).getRGB(); return Color::getHSBColor(224 / 360.0f - temp * 0.05f, 0.50f + temp * 0.1f, 1.0f).getRGB();
} }
Biome::MobList& Biome::getMobs(const MobCategory& category) Biome::MobList& Biome::getMobs(const MobCategory& category)

View File

@@ -69,11 +69,11 @@ Biome* BiomeSource::getBiome( int x, int z )
return getBiomeBlock(x, z, 1, 1)[0]; return getBiomeBlock(x, z, 1, 1)[0];
} }
//float BiomeSource::getTemperature( int x, int z ) float BiomeSource::getTemperature( int x, int z )
//{ {
// temperatures = temperatureMap->getRegion(temperatures, x, z, 1, 1, tempScale, tempScale, 0.5f); temperatures = temperatureMap->getRegion(temperatures, x, z, 1, 1, tempScale, tempScale, 0.5f);
// return temperatures[0]; return temperatures[0];
//} }
Biome** BiomeSource::getBiomeBlock( int x, int z, int w, int h ) Biome** BiomeSource::getBiomeBlock( int x, int z, int w, int h )
{ {
@@ -123,7 +123,7 @@ Biome** BiomeSource::getBiomeBlock( Biome** biomes__, int x, int z, int w, int h
return biomes; return biomes;
} }
float* BiomeSource::getTemperatureBlock( /*float* temperatures__, */int x, int z, int w, int h ) float* BiomeSource::getTemperatureBlock( float* temperatures__, int x, int z, int w, int h )
{ {
//LOGI("gTempBlock: 1\n"); //LOGI("gTempBlock: 1\n");
//const int size = w * h; //const int size = w * h;
@@ -164,8 +164,8 @@ float* BiomeSource::getTemperatureBlock( /*float* temperatures__, */int x, int z
return temperatures; return temperatures;
} }
//float* BiomeSource::getDownfallBlock( /*float* downfalls__,*/ int x, int z, int w, int h ) float* BiomeSource::getDownfallBlock( float* downfalls__, int x, int z, int w, int h )
//{ {
// //const int size = w * h; // //const int size = w * h;
// //if (lenDownfalls < size) { // //if (lenDownfalls < size) {
// // delete[] downfalls; // // delete[] downfalls;
@@ -173,6 +173,6 @@ float* BiomeSource::getTemperatureBlock( /*float* temperatures__, */int x, int z
// // lenDownfalls = size; // // lenDownfalls = size;
// //} // //}
// //
// downfalls = downfallMap->getRegion(downfalls, x, z, w, w, downfallScale, downfallScale, 0.5f); downfalls = downfallMap->getRegion(downfalls, x, z, w, w, downfallScale, downfallScale, 0.5f);
// return downfalls; return downfalls;
//} }

View File

@@ -31,13 +31,13 @@ public:
virtual Biome* getBiome(const ChunkPos& chunk); virtual Biome* getBiome(const ChunkPos& chunk);
virtual Biome* getBiome(int x, int z); virtual Biome* getBiome(int x, int z);
//virtual float getTemperature(int x, int z); virtual float getTemperature(int x, int z);
// Note: The arrays returned here are temporary in the meaning that their // Note: The arrays returned here are temporary in the meaning that their
// contents might change in the future. If you need to SAVE the // contents might change in the future. If you need to SAVE the
// values, do a shallow copy to an array of your own. // values, do a shallow copy to an array of your own.
virtual float* getTemperatureBlock(/*float* temperatures, */ int x, int z, int w, int h); virtual float* getTemperatureBlock(float* temperatures, int x, int z, int w, int h);
//virtual float* getDownfallBlock(/*float* downfalls, */int x, int z, int w, int h); virtual float* getDownfallBlock(float* downfalls, int x, int z, int w, int h);
virtual Biome** getBiomeBlock(int x, int z, int w, int h); virtual Biome** getBiomeBlock(int x, int z, int w, int h);
private: private:

View File

@@ -6,6 +6,7 @@
#include "Biome.h" #include "Biome.h"
#include "../levelgen/feature/TreeFeature.h" #include "../levelgen/feature/TreeFeature.h"
#include "../levelgen/feature/BirchFeature.h" #include "../levelgen/feature/BirchFeature.h"
#include "../levelgen/feature/BasicTree.h"
class ForestBiome: public Biome class ForestBiome: public Biome
{ {
@@ -15,7 +16,7 @@ public:
return new BirchFeature(); return new BirchFeature();
} }
if (random->nextInt(3) == 0) { if (random->nextInt(3) == 0) {
//return new BasicTree(); return new BasicTree(false);
} }
return new TreeFeature(false); return new TreeFeature(false);
} }

View File

@@ -6,13 +6,14 @@
#include "Biome.h" #include "Biome.h"
#include "../../../util/Random.h" #include "../../../util/Random.h"
#include "../levelgen/feature/TreeFeature.h" #include "../levelgen/feature/TreeFeature.h"
#include "../levelgen/feature/BasicTree.h"
class RainforestBiome: public Biome class RainforestBiome: public Biome
{ {
public: public:
Feature* getTreeFeature(Random* random) { Feature* getTreeFeature(Random* random) {
if (random->nextInt(3) == 0) { if (random->nextInt(3) == 0) {
//return new BasicTree(); return new BasicTree(false);
} }
return new TreeFeature(false); return new TreeFeature(false);
} }

View File

@@ -262,14 +262,14 @@ void LevelChunk::recalcHeight(int x, int yStart, int z) {
/*public*/ /*public*/
void LevelChunk::skyBrightnessChanged() { void LevelChunk::skyBrightnessChanged() {
// int x0 = xt; int x0 = xt;
// int y0 = this->minHeight - 16; int y0 = this->minHeight - 16;
// int z0 = zt; int z0 = zt;
// int x1 = xt + 16; int x1 = xt + 16;
// int y1 = Level::DEPTH - 1; int y1 = Level::DEPTH - 1;
// int z1 = zt + 16; int z1 = zt + 16;
//level->setTilesDirty(x0, y0, z0, x1, y1, z1); level->setTilesDirty(x0, y0, z0, x1, y1, z1);
} }
/*public*/ /*public*/

View File

@@ -15,7 +15,8 @@ Dimension::Dimension()
ultraWarm(false), ultraWarm(false),
hasCeiling(false), hasCeiling(false),
biomeSource(NULL), biomeSource(NULL),
id(0) id(0),
fogColor(0x80daff)
{ {
} }
@@ -93,6 +94,18 @@ float* Dimension::getSunriseColor( float td, float a )
Vec3 Dimension::getFogColor( float td, float a ) Vec3 Dimension::getFogColor( float td, float a )
{ {
if (FogType == 1)
{
fogColor = 0xc0d8ff; // 1 returns java beta styled fog color.
}
else if (FogType == 2)
{
fogColor = 0x406fe5; // 2 returns some type of unused fog color IDK what this one was used for possibly early pe??
}
else // otherwise as default we return the mcpe fog color
{
fogColor = 0x80daff;
}
float br = Mth::cos(td * Mth::PI * 2) * 2 + 0.5f; float br = Mth::cos(td * Mth::PI * 2) * 2 + 0.5f;
if (br < 0.0f) br = 0.0f; if (br < 0.0f) br = 0.0f;
if (br > 1.0f) br = 1.0f; if (br > 1.0f) br = 1.0f;
@@ -104,7 +117,8 @@ Vec3 Dimension::getFogColor( float td, float a )
g *= br * 0.94f + 0.06f; g *= br * 0.94f + 0.06f;
b *= br * 0.91f + 0.09f; b *= br * 0.91f + 0.09f;
return Vec3(r, g, b); return Vec3(r, g, b);
//return Vec3(0.752941f, 0.847059f, 1);
//
} }
bool Dimension::mayRespawn() bool Dimension::mayRespawn()

View File

@@ -49,8 +49,11 @@ public:
bool hasCeiling; bool hasCeiling;
float brightnessRamp[16];//Level::MAX_BRIGHTNESS + 1]; float brightnessRamp[16];//Level::MAX_BRIGHTNESS + 1];
int id; int id;
// shredder added
int FogType; // lets us choose between what fog we want ig
protected: protected:
static const long fogColor = 0x80daff;//0x406fe5;//0xc0d8ff; long fogColor; //= 0x80daff;//0x406fe5;//0xc0d8ff;
float sunriseCol[4]; float sunriseCol[4];
}; };

View File

@@ -9,6 +9,7 @@
class NormalDayCycleDimension: public Dimension { class NormalDayCycleDimension: public Dimension {
public: public:
float getTimeOfDay(long time, float a) { float getTimeOfDay(long time, float a) {
int dayStep = (int) (time % Level::TICKS_PER_DAY); int dayStep = (int) (time % Level::TICKS_PER_DAY);
float td = (dayStep + a) / Level::TICKS_PER_DAY - 0.25f; float td = (dayStep + a) / Level::TICKS_PER_DAY - 0.25f;
@@ -20,6 +21,18 @@ public:
} }
Vec3 getFogColor( float td, float a ) { Vec3 getFogColor( float td, float a ) {
if (FogType == 1)
{
fogColor = 0xc0d8ff; // 1 returns java beta styled fog color.
}
else if (FogType == 2)
{
fogColor = 0x406fe5; // 2 returns some type of unused fog color IDK what this one was used for possibly early pe??
}
else // otherwise as default we return the mcpe fog color
{
fogColor = 0x80daff;
}
float br = cos(td * Mth::PI * 2) * 2 + 0.5f; float br = cos(td * Mth::PI * 2) * 2 + 0.5f;
if (br < 0) br = 0; if (br < 0) br = 0;
if (br > 1.f) br = 1.f; if (br > 1.f) br = 1.f;

View File

@@ -1,4 +1,4 @@
#if 0
#include "CanyonFeature.h" #include "CanyonFeature.h"
@@ -138,7 +138,7 @@ void CanyonFeature::addTunnel( int xOffs, int zOffs, unsigned char* blocks, floa
} }
} }
void CanyonFeature::addFeature( Level level, int x, int z, int xOffs, int zOffs, char* blocks ) void CanyonFeature::addFeature(Level* level, int x, int z, int xOffs, int zOffs,unsigned char* blocks)
{ {
if (random.nextInt(15) != 0) return; if (random.nextInt(15) != 0) return;
@@ -151,6 +151,7 @@ void CanyonFeature::addFeature( Level level, int x, int z, int xOffs, int zOffs,
float thickness = (random.nextFloat() * 2 + random.nextFloat()) + 1; float thickness = (random.nextFloat() * 2 + random.nextFloat()) + 1;
addTunnel(xOffs, zOffs, blocks, xCave, yCave, zCave, thickness, yRot, xRot, 0, 0, 5.0); addTunnel(xOffs, zOffs, blocks, xCave, yCave, zCave, thickness, yRot, xRot, 0, 0, 5.0);
} }
/* //private /* //private
@@ -165,4 +166,4 @@ void CanyonFeature::addFeature( Level level, int x, int z, int xOffs, int zOffs,
for (int z = zOffs - r; z <= zOffs + r; z++) { for (int z = zOffs - r; z <= zOffs + r; z++) {
random.setSeed((x * xScale + z * zScale) ^ level.seed);*/ random.setSeed((x * xScale + z * zScale) ^ level.seed);*/
#endif

View File

@@ -1,7 +1,7 @@
#ifndef NET_MINECRAFT_WORLD_LEVEL_LEVELGEN__CanyonFeature_H__ #ifndef NET_MINECRAFT_WORLD_LEVEL_LEVELGEN__CanyonFeature_H__
#define NET_MINECRAFT_WORLD_LEVEL_LEVELGEN__CanyonFeature_H__ #define NET_MINECRAFT_WORLD_LEVEL_LEVELGEN__CanyonFeature_H__
#if 0
//package net.minecraft.world.level.levelgen; //package net.minecraft.world.level.levelgen;
@@ -12,8 +12,8 @@ class CanyonFeature: public LargeFeature {
/*protected*/ /*protected*/
void addTunnel(int xOffs, int zOffs, unsigned char* blocks, float xCave, float yCave, float zCave, float thickness, float yRot, float xRot, int step, int dist, float yScale); void addTunnel(int xOffs, int zOffs, unsigned char* blocks, float xCave, float yCave, float zCave, float thickness, float yRot, float xRot, int step, int dist, float yScale);
/*protected*/ /*protected*/
void addFeature(Level level, int x, int z, int xOffs, int zOffs, char* blocks); void addFeature(Level* level, int x, int z, int xOffs, int zOffs,unsigned char* blocks);
}; };
#endif
#endif /*NET_MINECRAFT_WORLD_LEVEL_LEVELGEN__CanyonFeature_H__*/ #endif /*NET_MINECRAFT_WORLD_LEVEL_LEVELGEN__CanyonFeature_H__*/

View File

@@ -370,6 +370,18 @@ void RandomLevelSource::postProcess(ChunkSource* parent, int xt, int zt) {
} }
//printf("placing tree at %d, %d, %d\n", x, y, z); //printf("placing tree at %d, %d, %d\n", x, y, z);
} }
// for (int i = 0; i < forests; i++) {
// int x = xo + random.nextInt(16) + 8;
// int z = zo + random.nextInt(16) + 8;
//int y = level->getHeightmap(x, z);
// Feature* tree = biome->getBasicTreeFeature(&random);
//if (tree) {
// tree->init(1, 1, 1);
// tree->place(level, &random, x, y, z);
// delete tree;
//}
////printf("placing tree at %d, %d, %d\n", x, y, z);
// }
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
int x = xo + random.nextInt(16) + 8; int x = xo + random.nextInt(16) + 8;
@@ -461,7 +473,7 @@ void RandomLevelSource::postProcess(ChunkSource* parent, int xt, int zt) {
MobSpawner::postProcessSpawnMobs(level, biome, xo + 8, zo + 8, 16, 16, &random); MobSpawner::postProcessSpawnMobs(level, biome, xo + 8, zo + 8, 16, 16, &random);
//LOGI("Reading temp: 1\n"); //LOGI("Reading temp: 1\n");
float* temperatures = level->getBiomeSource()->getTemperatureBlock(/*NULL,*/ xo + 8, zo + 8, 16, 16); float* temperatures = level->getBiomeSource()->getTemperatureBlock(NULL, xo + 8, zo + 8, 16, 16);
for (int x = xo + 8; x < xo + 8 + 16; x++) for (int x = xo + 8; x < xo + 8 + 16; x++)
for (int z = zo + 8; z < zo + 8 + 16; z++) { for (int z = zo + 8; z < zo + 8 + 16; z++) {
int xp = x - (xo + 8); int xp = x - (xo + 8);

View File

@@ -0,0 +1,446 @@
#ifndef NET_MINECRAFT_WORLD_LEVEL_LEVELGEN_FEATURE__BasicTree_H__
#define NET_MINECRAFT_WORLD_LEVEL_LEVELGEN_FEATURE__BasicTree_H__
//package net.minecraft.world.level.levelgen.feature;
#include "Feature.h"
#include "../../../../util/Random.h"
#include "../../Level.h"
#include "../../tile/TreeTile.h"
class Level;
class BasicTree : public Feature
{
typedef Feature super;
private:
unsigned char axisConversionArray[6];
Random *rnd;
Level *thisLevel;
int origin[3];
int height;
int trunkHeight;
double trunkHeightScale;
double branchDensity;
double branchSlope;
double widthScale;
double foliageDensity;
int trunkWidth;
int heightVariance;
int foliageHeight;
int **foliageCoords;
int foliageCoordsLength;
void prepare(){
trunkHeight = (int) (height * trunkHeightScale);
if (trunkHeight >= height) trunkHeight = height - 1;
int clustersPerY = (int) (1.382 + pow(foliageDensity * height / 13.0, 2));
if (clustersPerY < 1) clustersPerY = 1;
int **tempFoliageCoords = new int *[clustersPerY * height];
for( int i = 0; i < clustersPerY * height; i++ )
{
tempFoliageCoords[i] = new int[4];
}
int y = origin[1] + height - foliageHeight;
int clusterCount = 1;
int trunkTop = origin[1] + trunkHeight;
int relativeY = y - origin[1];
tempFoliageCoords[0][0] = origin[0];
tempFoliageCoords[0][1] = y;
tempFoliageCoords[0][2] = origin[2];
tempFoliageCoords[0][3] = trunkTop;
y--;
while (relativeY >= 0)
{
int num = 0;
float shapefac = treeShape(relativeY);
if (shapefac < 0)
{
y--;
relativeY--;
continue;
}
double originOffset = 0.5;
while (num < clustersPerY)
{
double radius = widthScale * (shapefac * (rnd->nextFloat() + 0.328));
double angle = rnd->nextFloat() * 2.0 * 3.14159;
int x = Mth::floor(radius * sin(angle) + origin[0] + originOffset);
int z = Mth::floor(radius * cos(angle) + origin[2] + originOffset);
int checkStart[] = { x, y, z };
int checkEnd[] = { x, y + foliageHeight, z };
if (checkLine(checkStart, checkEnd) == -1) {
int checkBranchBase[] = { origin[0], origin[1], origin[2] };
double distance = sqrt(pow(abs(origin[0] - checkStart[0]), 2.0) + pow(abs(origin[2] - checkStart[2]), 2.0));
double branchHeight = distance * branchSlope;
if ((checkStart[1] - branchHeight) > trunkTop)
{
checkBranchBase[1] = trunkTop;
}
else
{
checkBranchBase[1] = (int) (checkStart[1] - branchHeight);
}
if (checkLine(checkBranchBase, checkStart) == -1)
{
tempFoliageCoords[clusterCount][0] = x;
tempFoliageCoords[clusterCount][1] = y;
tempFoliageCoords[clusterCount][2] = z;
tempFoliageCoords[clusterCount][3] = checkBranchBase[1];
clusterCount++;
}
}
num++;
}
y--;
relativeY--;
}
foliageCoordsLength = clusterCount;
foliageCoords = tempFoliageCoords;
for( int i = clusterCount; i < clustersPerY * height; i++ )
{
delete [] tempFoliageCoords[i];
tempFoliageCoords[i] = NULL;
}
}
void crossection(int x, int y, int z, float radius, unsigned char direction, int material)
{
int rad = (int) (radius + 0.618);
unsigned char secidx1 = axisConversionArray[direction];
unsigned char secidx2 = axisConversionArray[direction + 3];
int center[] = { x, y, z };
int position[] = { 0, 0, 0 };
int offset1 = -rad;
int offset2 = -rad;
int thismat;
position[direction] = center[direction];
while (offset1 <= rad)
{
position[secidx1] = center[secidx1] + offset1;
offset2 = -rad;
while (offset2 <= rad)
{
double thisdistance = pow(abs(offset1) + 0.5, 2) + pow(abs(offset2) + 0.5, 2);
if (thisdistance > radius * radius)
{
offset2++;
continue;
}
position[secidx2] = center[secidx2] + offset2;
thismat = thisLevel->getTile(position[0], position[1], position[2]);
if (!((thismat == 0) || (thismat == Tile::leaves->id)))
{
offset2++;
continue;
}
placeBlock(thisLevel, position[0], position[1], position[2], material, 0);
offset2++;
}
offset1++;
}
}
float treeShape(int y){
if (y < (((float) height) * 0.3)) return (float) -1.618;
float radius = ((float) height) / ((float) 2.0);
float adjacent = (((float) height) / ((float) 2.0)) - y;
float distance;
if (adjacent == 0) distance = radius;
else if (abs(adjacent) >= radius) distance = (float) 0.0;
else distance = (float) sqrt(pow(abs(radius), 2) - pow(abs(adjacent), 2));
distance *= (float) 0.5;
return distance;
}
float foliageShape(int y){
if ((y < 0) || (y >= foliageHeight)) return (float) -1;
else if ((y == 0) || (y == (foliageHeight - 1))) return (float) 2;
else return (float) 3;
}
void foliageCluster(int x, int y, int z){
int topy = y + foliageHeight;
int cury = topy - 1;
float radius;
while (cury >= y)
{
radius = foliageShape(cury - y);
crossection(x, cury, z, radius, (unsigned char) 1, Tile::leaves->id);
cury--;
}
}
void limb(int *start, int *end, int material)
{
int delta[] = { 0, 0, 0 };
unsigned char idx = 0;
unsigned char primidx = 0;
while (idx < 3)
{
delta[idx] = end[idx] - start[idx];
if (abs(delta[idx]) > abs(delta[primidx]))
{
primidx = idx;
}
idx++;
}
if (delta[primidx] == 0) return;
unsigned char secidx1 = axisConversionArray[primidx];
unsigned char secidx2 = axisConversionArray[primidx + 3];
char primsign;
if (delta[primidx] > 0) primsign = 1;
else primsign = -1;
double secfac1 = ((double) delta[secidx1]) / ((double) delta[primidx]);
double secfac2 = ((double) delta[secidx2]) / ((double) delta[primidx]);
int coordinate[] = { 0, 0, 0 };
int primoffset = 0;
int endoffset = delta[primidx] + primsign;
while (primoffset != endoffset)
{
coordinate[primidx] = Mth::floor(start[primidx] + primoffset + 0.5);
coordinate[secidx1] = Mth::floor(start[secidx1] + (primoffset * secfac1) + 0.5);
coordinate[secidx2] = Mth::floor(start[secidx2] + (primoffset * secfac2) + 0.5);
int dir = 0;
int xdiff = abs(coordinate[0] - start[0]);
int zdiff = abs(coordinate[2] - start[2]);
int maxdiff = (std::max)(xdiff, zdiff);
if (maxdiff > 0)
{
if (xdiff == maxdiff)
{
dir = 0;
}
else if (zdiff == maxdiff)
{
dir = 0;
}
}
placeBlock(thisLevel, coordinate[0], coordinate[1], coordinate[2], material, dir);
primoffset += primsign;
}
}
void makeFoliage(){
int idx = 0;
int finish = foliageCoordsLength;
while (idx < finish)
{
int x = foliageCoords[idx][0];
int y = foliageCoords[idx][1];
int z = foliageCoords[idx][2];
foliageCluster(x, y, z);
idx++;
}
}
bool trimBranches(int localY){
if (localY < (height * 0.2)) return false;
else return true;
}
void makeTrunk(){
int x = origin[0];
int startY = origin[1];
int topY = origin[1] + trunkHeight;
int z = origin[2];
int startCoord[] = { x, startY, z };
int endCoord[] = { x, topY, z };
limb(startCoord, endCoord, Tile::treeTrunk->id);
if (trunkWidth == 2)
{
startCoord[0] += 1;
endCoord[0] += 1;
limb(startCoord, endCoord, Tile::treeTrunk->id);
startCoord[2] += 1;
endCoord[2] += 1;
limb(startCoord, endCoord, Tile::treeTrunk->id);
startCoord[0] += -1;
endCoord[0] += -1;
limb(startCoord, endCoord, Tile::treeTrunk->id);
}
}
void makeBranches(){
int idx = 0;
int finish = foliageCoordsLength;
int baseCoord[] = { origin[0], origin[1], origin[2] };
while (idx < finish)
{
int *coordValues = foliageCoords[idx];
int endCoord[] = { coordValues[0], coordValues[1], coordValues[2] };
baseCoord[1] = coordValues[3];
int localY = baseCoord[1] - origin[1];
if (trimBranches(localY))
{
limb(baseCoord, endCoord, Tile::treeTrunk->id);
}
idx++;
}
}
int checkLine(int *start, int *end){
int delta[] = { 0, 0, 0 };
unsigned char idx = 0;
unsigned char primidx = 0;
while (idx < 3)
{
delta[idx] = end[idx] - start[idx];
if (abs(delta[idx]) > abs(delta[primidx]))
{
primidx = idx;
}
idx++;
}
if (delta[primidx] == 0) return -1;
unsigned char secidx1 = axisConversionArray[primidx];
unsigned char secidx2 = axisConversionArray[primidx + 3];
char primsign;
if (delta[primidx] > 0) primsign = 1;
else primsign = -1;
double secfac1 = ((double) delta[secidx1]) / ((double) delta[primidx]);
double secfac2 = ((double) delta[secidx2]) / ((double) delta[primidx]);
int coordinate[] = { 0, 0, 0 };
int primoffset = 0;
int endoffset = delta[primidx] + primsign;
int thismat;
while (primoffset != endoffset)
{
coordinate[primidx] = start[primidx] + primoffset;
coordinate[secidx1] = Mth::floor(start[secidx1] + (primoffset * secfac1));
coordinate[secidx2] = Mth::floor(start[secidx2] + (primoffset * secfac2));
thismat = thisLevel->getTile(coordinate[0], coordinate[1], coordinate[2]);
if (!((thismat == 0) || (thismat == Tile::leaves->id)))
{
break;
}
primoffset += primsign;
}
if (primoffset == endoffset)
{
return -1;
}
else
{
return abs(primoffset);
}
}
bool checkLocation(){
int startPosition[] = { origin[0], origin[1], origin[2] };
int endPosition[] = { origin[0], origin[1] + height - 1, origin[2] };
int baseMaterial = thisLevel->getTile(origin[0], origin[1] - 1, origin[2]);
if (!((baseMaterial == 2) || (baseMaterial == 3)))
{
return false;
}
int allowedHeight = checkLine(startPosition, endPosition);
if (allowedHeight == -1)
{
return true;
}
else if (allowedHeight < 6)
{
return false;
}
else
{
height = allowedHeight;
return true;
}
}
public:
BasicTree(bool doUpdate){
axisConversionArray[0] = 2;
axisConversionArray[1] = 0;
axisConversionArray[2] = 0;
axisConversionArray[3] = 1;
axisConversionArray[4] = 2;
axisConversionArray[5] = 1;
rnd = new Random();
origin[0] = 0;
origin[1] = 0;
origin[2] = 0;
height = 0;
trunkHeight = 0;
trunkHeightScale = 0.618;
branchDensity = 1.0;
branchSlope = 0.381;
widthScale = 1.0;
foliageDensity = 1.0;
trunkWidth = 1;
heightVariance = 12;
foliageHeight = 4;
foliageCoords = NULL;
foliageCoordsLength = 0;
}
virtual ~BasicTree(){
delete rnd;
for( int i = 0; i < foliageCoordsLength; i++ )
{
delete [] foliageCoords[i];
}
delete [] foliageCoords;
}
virtual void init(double heightInit, double widthInit, double foliageDensityInit){
heightVariance = (int) (heightInit * 12);
if (heightInit > 0.5) foliageHeight = 5;
widthScale = widthInit;
foliageDensity = foliageDensityInit;
}
virtual bool place(Level *level, Random *random, int x, int y, int z){
thisLevel = level;
int seed = random->nextLong();
rnd->setSeed(seed);
origin[0] = x;
origin[1] = y;
origin[2] = z;
if (height == 0)
{
height = 5 + rnd->nextInt(heightVariance);
}
if (!(checkLocation()))
{
return false;
}
prepare();
makeFoliage();
makeTrunk();
makeBranches();
return true;
}
};
#endif /*NET_MINECRAFT_WORLD_LEVEL_LEVELGEN_FEATURE__BasicTree_H__*/

View File

@@ -38,7 +38,7 @@ public:
setFlammable(Tile::tnt->id, FLAME_MEDIUM, BURN_INSTANT); setFlammable(Tile::tnt->id, FLAME_MEDIUM, BURN_INSTANT);
setFlammable(Tile::cloth->id, FLAME_EASY, BURN_EASY); setFlammable(Tile::cloth->id, FLAME_EASY, BURN_EASY);
//setTicking(true); //@fire setTicking(true); //@fire
} }
AABB* getAABB(Level* level, int x, int y, int z) { AABB* getAABB(Level* level, int x, int y, int z) {
@@ -70,9 +70,9 @@ public:
} }
void tick(Level* level, int x, int y, int z, Random* random) { void tick(Level* level, int x, int y, int z, Random* random) {
return; //@fire
bool infiniBurn = false;//level->getTile(x, y - 1, z) == Tile::hellRock->id;
bool infiniBurn = level->getTile(x, y - 1, z) == Tile::netherrack->id;
int age = level->getData(x, y, z); int age = level->getData(x, y, z);
if (age < 15) { if (age < 15) {
@@ -148,7 +148,6 @@ public:
} }
void neighborChanged(Level* level, int x, int y, int z, int type) { void neighborChanged(Level* level, int x, int y, int z, int type) {
return; //@fire
if (!level->isSolidBlockingTile(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) { if (!level->isSolidBlockingTile(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) {
level->setTile(x, y, z, 0); level->setTile(x, y, z, 0);
return; return;
@@ -156,7 +155,6 @@ public:
} }
void onPlace(Level* level, int x, int y, int z) { void onPlace(Level* level, int x, int y, int z) {
return; //@fire
if (!level->isSolidBlockingTile(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) { if (!level->isSolidBlockingTile(x, y - 1, z) && !isValidFireLocation(level, x, y, z)) {
level->setTile(x, y, z, 0); level->setTile(x, y, z, 0);
return; return;
@@ -169,7 +167,6 @@ public:
} }
void ignite(Level* level, int x, int y, int z) { void ignite(Level* level, int x, int y, int z) {
return; //@fire
bool lit = false; bool lit = false;
if (!lit) lit = tryIgnite(level, x, y + 1, z); if (!lit) lit = tryIgnite(level, x, y + 1, z);
@@ -184,11 +181,10 @@ public:
} }
void animateTick(Level* level, int x, int y, int z, Random* random) { void animateTick(Level* level, int x, int y, int z, Random* random) {
return; //@fire
//if (random.nextInt(24) == 0) { if (random->nextInt(24) == 0) {
// level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, "fire.fire", 1 + random.nextFloat(), random.nextFloat() * 0.7f + 0.3f); level->playSound(x + 0.5f, y + 0.5f, z + 0.5f, "fire.fire", 1 + random->nextFloat(), random->nextFloat() * 0.7f + 0.3f);
//} }
if (level->isSolidBlockingTile(x, y - 1, z) || Tile::fire->canBurn(level, x, y - 1, z)) { if (level->isSolidBlockingTile(x, y - 1, z) || Tile::fire->canBurn(level, x, y - 1, z)) {
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
@@ -248,7 +244,6 @@ private:
} }
void checkBurn(Level* level, int x, int y, int z, int chance, Random* random) { void checkBurn(Level* level, int x, int y, int z, int chance, Random* random) {
return; //@fire
int odds = burnOdds[level->getTile(x, y, z)]; int odds = burnOdds[level->getTile(x, y, z)];
if (random->nextInt(chance) < odds) { if (random->nextInt(chance) < odds) {
@@ -265,7 +260,6 @@ private:
} }
bool isValidFireLocation(Level* level, int x, int y, int z) { bool isValidFireLocation(Level* level, int x, int y, int z) {
return false; //@fire
if (canBurn(level, x + 1, y, z)) return true; if (canBurn(level, x + 1, y, z)) return true;
if (canBurn(level, x - 1, y, z)) return true; if (canBurn(level, x - 1, y, z)) return true;
@@ -278,7 +272,6 @@ private:
} }
int getFireOdds(Level* level, int x, int y, int z) { int getFireOdds(Level* level, int x, int y, int z) {
return 0; //@fire
int odds = 0; int odds = 0;
if (!level->isEmptyTile(x, y, z)) return 0; if (!level->isEmptyTile(x, y, z)) return 0;
@@ -294,7 +287,6 @@ private:
} }
bool tryIgnite(Level* level, int x, int y, int z) { bool tryIgnite(Level* level, int x, int y, int z) {
return false; //@fire
int t = level->getTile(x, y, z); int t = level->getTile(x, y, z);
if (t == Tile::fire->id) return true; if (t == Tile::fire->id) return true;

View File

@@ -1,6 +1,11 @@
#include "GrassTile.h" #include "GrassTile.h"
#include "../material/Material.h" #include "../material/Material.h"
#include "../../entity/item/ItemEntity.h" #include "../../entity/item/ItemEntity.h"
#include "../GrassColor.h"
#include "../Level.h"
#include "../LevelSource.h"
#include "../biome/BiomeSource.h"
#include "../../../client/Minecraft.h"
GrassTile::GrassTile(int id) GrassTile::GrassTile(int id)
: super(id, Material::dirt) : super(id, Material::dirt)
@@ -24,11 +29,18 @@ int GrassTile::getTexture( int face, int data ) {
} }
int GrassTile::getColor( LevelSource* level, int x, int y, int z ) { int GrassTile::getColor( LevelSource* level, int x, int y, int z ) {
//level.getBiomeSource().getBiomeBlock(x, z, 1, 1);
//float temp = level.getBiomeSource().temperatures[0];
//float rain = level.getBiomeSource().downfalls[0];
return 0x339933;//GrassColor.get(temp, rain); if(!GrassColor::useTint){
return 0x339933;
}
level->getBiomeSource()->getBiomeBlock(x, z, 1, 1);
float temp = level->getBiomeSource()->temperatures[0];
float rain = level->getBiomeSource()->downfalls[0];
// return 0x339933;//GrassColor.get(temp, rain); // we need to hook this up with OPTION_FOLIAGE_TINT
return GrassColor::get(temp, rain);
} }
void GrassTile::tick( Level* level, int x, int y, int z, Random* random ) { void GrassTile::tick( Level* level, int x, int y, int z, Random* random ) {

View File

@@ -14,6 +14,7 @@ class GrassTile: public Tile
{ {
typedef Tile super; typedef Tile super;
public: public:
static const int MIN_BRIGHTNESS = 4; static const int MIN_BRIGHTNESS = 4;
GrassTile(int id); GrassTile(int id);

View File

@@ -9,6 +9,8 @@
#include "../../item/Item.h" #include "../../item/Item.h"
#include "../../item/ItemInstance.h" #include "../../item/ItemInstance.h"
#include "../FoliageColor.h" #include "../FoliageColor.h"
#include "../LevelSource.h"
#include "../biome/BiomeSource.h"
class Entity; class Entity;
@@ -54,10 +56,18 @@ public:
if (data == BIRCH_LEAF) { if (data == BIRCH_LEAF) {
return FoliageColor::getBirchColor(); return FoliageColor::getBirchColor();
} }
if (!FoliageColor::useTint){
return FoliageColor::getDefaultColor(); return FoliageColor::getDefaultColor();
} }
// return FoliageColor::getDefaultColor(); we need to hook this up with OPTION_FOLIAGE_TINT
level->getBiomeSource()->getBiomeBlock(x, z, 1, 1);
float temperature = level->getBiomeSource()->temperatures[0];
float rainfall = level->getBiomeSource()->downfalls[0];
return FoliageColor::get(temperature, rainfall);
}
void onRemove(Level* level, int x, int y, int z) { void onRemove(Level* level, int x, int y, int z) {
int r = 1; int r = 1;
int r2 = r + 1; int r2 = r + 1;