tag:blogger.com,1999:blog-50591888731591211602024-03-13T09:34:43.777-07:00VR Game DevelopmentVR development3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.comBlogger152125tag:blogger.com,1999:blog-5059188873159121160.post-48867274551718628182023-05-02T05:27:00.002-07:002023-05-02T05:27:43.503-07:00Replicating MidJourney within Stable Diffusion<p>MidJourney allows me to produce crazy amazing portraits. There is an open source alternative to MidJourney called "Stable Diffusion".</p><p>Over the last 5 days I challenged myself to reproduce the look of MidJourney in Stable Diffusion. I'm liking the result.</p><p>MidJourney image:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDCFdnGm71Uf9BoWybAawvHQHVexjy91VmnPaanLuLtjbhSym1mm1sFPkFYlYDBkr45Di9k47v9O7L1aERVKt-dadaszrc9fU7U1H2JwCWJUEN8boZSLBY8uH5WK3Y2tc9mBdJgaeGJd74kG83biyWOs4n3pBi4sSEqBip4mLNYP6NTjd8LxutOWaZkQ/s1344/844e150e-1809-4fa1-9c52-0bc90fcd03f0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1344" data-original-width="873" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDCFdnGm71Uf9BoWybAawvHQHVexjy91VmnPaanLuLtjbhSym1mm1sFPkFYlYDBkr45Di9k47v9O7L1aERVKt-dadaszrc9fU7U1H2JwCWJUEN8boZSLBY8uH5WK3Y2tc9mBdJgaeGJd74kG83biyWOs4n3pBi4sSEqBip4mLNYP6NTjd8LxutOWaZkQ/s320/844e150e-1809-4fa1-9c52-0bc90fcd03f0.png" width="208" /></a></div><br />Stable Diffusion image: <p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMvsSkparhoMOF20bqY_2ikPkaoIc84By0bxzakV2kSJY9hcNoTdaeKzKA4A5R1KW_Ujhu7GGX69JZ95jv5trMIYU-aWaZww31R7j4p3JaqBla5zEdMtTioY_BGznpo_EcJCoyPcMPyOJefZDhUYYr74bP3hBlcS2q3AILsAlUlk4B4CyfQwTHaVOGfQ/s512/stable_sample.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="512" data-original-width="512" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMvsSkparhoMOF20bqY_2ikPkaoIc84By0bxzakV2kSJY9hcNoTdaeKzKA4A5R1KW_Ujhu7GGX69JZ95jv5trMIYU-aWaZww31R7j4p3JaqBla5zEdMtTioY_BGznpo_EcJCoyPcMPyOJefZDhUYYr74bP3hBlcS2q3AILsAlUlk4B4CyfQwTHaVOGfQ/s320/stable_sample.png" width="320" /></a></div><br /><p>Stable Diffusion is an open source text to image program you run on your local computer via python. So... if you can get it to do what you want it is free with the caveat that the resulting image will be 512x512. This may be a bit technical but I wanted to help anyone trying to get Stable Diffusion to produce decent images. It is very doable.</p><p>This tutorial is decent but it is lacking in optimization:</p><p><a href="https://www.youtube.com/watch?v=Bdl-jWR3Ukc">https://www.youtube.com/watch?v=Bdl-jWR3Ukc</a></p><p><br /></p><p>Here are some things to understand:</p><p>First off, you won't produce great images without a negative prompt. I stumbled onto this negative prompt and it was a game changer:</p><p><span style="color: #999999;">easynegative, badhandv4.pt, bad quality, normal quality, worst quality, (((duplicate))), bad art, mutated, </span><span style="color: #999999;">extra limbs, extra legs, extra arms, bad anatomy, (blurry image:1.1), (blurry picture:1.1), </span><span style="color: #999999;">(worst quality, low quality:1.4), (out of frame), duplication, (folds:1.7), lowres, text, error, cropped, </span><span style="color: #999999;">worst quality, low quality, jpeg artifacts, duplicate, morbid, mutilated, out of frame, extra fingers, </span><span style="color: #999999;">mutated hands, poorly drawn hands, poorly drawn face, mutation, deformed, dehydrated, bad anatomy, bad proportions, </span><span style="color: #999999;">extra limbs, cloned face, disfigured, gross proportions, malformed limbs, missing arms, missing legs, (extra arms), </span><span style="color: #999999;">(extra legs), fused fingers, too many fingers, long neck, username, watermark, signature, monochrome, deformed legs, </span><span style="color: #999999;">face out of frame, head out of frame, head cropped, face cropped, same face twins</span></p><p>AI images are produced by feeding your text into a sophisticated prebuilt knowledge pathway called a model. The model is a file GBs in size and comes in 2 varies: checkpoint (old style) and safe-tensors (new style). The one commonly used is Stable Diffusion v1.5 (v1-5-pruned.ckpt) which is 7GB. Models are built by sifting thru millions of images that are tagged with relevant information. This isn't something the average person can do costing companies millions of dollars and a ton of processing power.</p><p>However...</p><p>You can use AI tools to graft new images into an existing model that replace a concept. This is the hard part. You are trying to "lightly" replace a concept without overdoing it. If you do it wrong Stable Diffusion ignores your prompt text and only produces images like what you give it. This is called overfitting. If you do it right you can get images to change their appearance based on the text of the prompt. </p><p>The tool I use to graft images into an existing model is dreambooth. I will assume you have installed Stable Diffusion and Dreambooth (see youtube video). You also need a graphics card with at least 12GB of VRAM. I have the Geforce 3080 ti which has 12GB of VRAM. </p><p>It is important to understand VRAM capacity is your enemy. It has caused me a lot of grief finding the perfect settings.</p><p>You will need a good model to start with. v1.5 raw is not good enough. There are people that graft generic images onto v1.5 for you to start from. </p><p>I recommend <a href="https://civitai.com/models/9114/consistent-factor">https://civitai.com/models/9114/consistent-factor</a> </p><p>Forget what the youtube video tells you. You will need 75 512x512 images that represent your subject in a variety of settings and poses. You can do it with less but VRAM will force you to build a smaller sized image. My setup allows you to build a 384x384 image with 12GB VRAM (which is really good). There are sites that allow you to quickly resize images to 512x512. (see youtube video for details on this).</p><p>I built 75 images in MidJourney in the style I wanted and resized them all to 512x512 and put those in 1 directory.</p><p>Once you have 75 images continue...</p><p>1. Download the consistent factor 4GB safe-tensors file and put it in your models/Stable-diffusion directory.</p><p>2. Go to dreambooth tab and create a new model based on that safe-tensors model. once it is built click 'load settings'</p><p>3. Once it is loaded click 'performance wizard' on settings tab. switch to concepts tab and click 'training wizard (person)'</p><p>4. click 'save settings' and 'load settings' because I don't trust this tool</p><p>'settings' tab entries of interest:</p><p>> Training Steps Per Image (Epochs) = 150</p><p>> Save model frequency = 25 (create safe-tensors model every 25 epochs)</p><p>> Save preview frequency = 5 (show previews every 5 epochs)</p><p>> batch size = 1</p><p>> Learning rate = 0.000005</p><p>> Max Resolution = 384 (if you run out of memory slide this down and retry until it works)</p><p>'concepts' tab entries of interest</p><p>> we are only doing 1 concept</p><p>> Dataset Directory = your 75 image directory</p><p>> Classification Dataset Directory = create a directory for this (dreambooth will fill it for you)</p><p>> Instance prompt = girl</p><p>> Class prompt = girl</p><p>> Sample image prompt = girl in a field</p><p>> Sample negative prompt = the one I gave above</p><p>> Class images per istance = 4 (300 ideal images / 74 provided images = 4)</p><p>> Number of samples to generate = 4</p><p>> Sample CFG scale = 7</p><p>> Sample Steps = 20</p><p><br /></p><p>once this is all entered, click 'save settings' and 'load settings'</p><p><br /></p><p>The commonly accepted min number of images to train on is 300. When you have less you ideally want the number of images you have to divide evenly into 300. You then take the remainder (4 in my case) and put that as Class images per istance.</p><p><br /></p><p>Our goal is to get Max Resolution as high as possible. </p><p>> 75 images + learning rate of 0.000005 + Class images per istance of 4 is the magic combination</p><p>> If you have more images, it needs more VRAM</p><p>> If you have less images, you need more class images which also needs more VRAM and slows down processing</p><p>> If you train slower (ex: 0.000002), you need more VRAM</p><p><br /></p><p>An epoch just means how many training steps per image. In this case each Epoch will be 150 training steps.</p><p>> This can take anywhere between 45 to 75 seconds depending on the complexity of your 75 images.</p><p><br /></p><p>After each 25 epochs your model will be saved in models\Stable-diffusion</p><p>> Once you have this model (your goal) you can test it (see below)</p><p><br /></p><p>click 'Train' and let it go until it it reaches epoch 26. then click 'cancel' and let it wrap up</p><p>> It will have saved a safe-tensors model after 25 epochs.</p><p>> Go to txt2img tab</p><p>> refresh the checkpoint list and pick your model/checkpoint</p><p>> prompt = girl in a field</p><p>> negative prompt = what I gave above</p><p>> click 'restore faces'</p><p>> slide batch size to 8</p><p>> click 'generate'</p><p><br /></p><p>If your model is good, the person will be in a variety of poses in the style you want. If your model overfits your text will have no impact on the result (which may still be ok). If your model is crappy you will see weird artifacts/glitches.</p><p><br /></p><p>NOTE: all images you produce via txt2img tab are stored in outputs\txt2img-images</p><p><br /></p><p>If you have a bad model it likely means your images are too different from each other.</p><p>You have 3 options to fix this:</p><p>1. You can try adding/removing words from the prompt to see if it gets better</p><p>2. You use this model as a starting point to run another 25 epochs for another save</p><p>3. Replace your images</p><p>25 epochs is ideal because if it works, it is likely not overfitted and flexible. The more epochs you run, the more the concept of 'girl' is hardwired to your images ignoring other words in your prompt.</p><p>Once you have this working you can do whatever you want. This is how people do deep fakes. You could replace 15 images in your 75 image set of a famous person, build a new model and they will show up in your results.</p>3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-27016965836342703372020-04-15T10:23:00.001-07:002020-04-15T10:23:15.986-07:00New game underway<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-Yd2Gn91CbII/XpdCNLOxXLI/AAAAAAAAD6c/zuShXtcq0bwM7R5FAR627ZaNKruN8s0jQCLcBGAsYHQ/s1600/stacks.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="369" data-original-width="562" height="262" src="https://1.bp.blogspot.com/-Yd2Gn91CbII/XpdCNLOxXLI/AAAAAAAAD6c/zuShXtcq0bwM7R5FAR627ZaNKruN8s0jQCLcBGAsYHQ/s400/stacks.jpg" width="400" /></a></div>
<br />
<br />
Since the summer of 2017 I have been working part time on a game written in C++ using the UE4 engine (see above).<br />
<br />
I recently played thru Half-Life Alex and it has became apparent that UE4 is lacking. I have stopped development and turned all my attention to learning how to write a game engine. I purposely wrote the game with no levels built in UE4 and no scripting in UE4.<br />
<br />
It may be unrealistic to swap out UE4 for my own engine but I'm going to give it a shot. Even if I fail I expect I will learn a ton.<br />
<br />
I am following the game engine series by "The Cherno". This guy is incredibly knowledgeable. I have decided to become a Partner Patreon member and are diving deep into all his videos.<br />
<br />
<a href="https://www.youtube.com/watch?v=W3gAzLwfIP0">OpenGL</a> is the current series I am starting3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com3tag:blogger.com,1999:blog-5059188873159121160.post-20363493472111800652019-09-10T06:12:00.000-07:002019-09-10T06:18:57.264-07:00Classic WOW Design<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-8xP5-sD_WRo/XXeYv7U-OmI/AAAAAAAADyU/bIlJhF9wdxsT0BpZrDUvI4S2kY_l17idgCLcBGAs/s1600/wow_classic_logo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="675" data-original-width="1428" height="187" src="https://1.bp.blogspot.com/-8xP5-sD_WRo/XXeYv7U-OmI/AAAAAAAADyU/bIlJhF9wdxsT0BpZrDUvI4S2kY_l17idgCLcBGAs/s400/wow_classic_logo.jpg" width="400" /></a></div>
<br />
I've never been a serious WOW player. I've never even taken a character to max level. If there is such a thing as a filthy casual, that's me (except I take showers).<br />
<br />
So when WOW classic came out, I figured I'd get it a fresh go. As a game designer, these are my thoughts so far:<br />
<br />
<b>Traveling to places requires a lot of walking</b><br />
Some quests require you to walk for minutes to reach your destination. It forces you to learn the landscape. It increases immersion. As far as I'm concerned, flying mounts should have never been added to the game. It detaches you from the environment.<br />
<br />
<b>Energy/Mana management is important</b><br />
As a mage, it usually takes half my mana to kill a single enemy. If another enemy attacks me, I could run out of mana and die ... so after every kill I stop to refill my mana.<br />
<br />
<b>Attacking 2 enemies/mobs at once, usually means you will die</b><br />
I'm used to Destiny and Diablo where you can steam roll over stuff. No can do in wow. If I see two enemies grouped together, I pass on attacking them solo. That adds a tactical component to the game. I hate that Destiny does not have this. Destiny's design approach is just to flood an area with mobs are rely on your twitch skills or constant re-spawning to get thru an area. It didn't used to be like that. In the original Destiny 1, you could slowly work your way through nightfall solo and get a halo achievement for that. Not any more. You play fast, accurate and furious or you suck.<br />
<br />
<b>The world feels vast</b><br />
It may look primitive but the environment goes on without pause. Modern games like Division, Destiny or Anthem put too much emphasis on fantastic visuals. These visuals require significant load times that they hide with maps or flying ships or in Anthem's case ... not well at all. I think there is a case for simpler graphics that allow the landscape to stretch on forever.<br />
<br />
<b>People are friendly</b><br />
Very rarely do I encounter anyone that is not friendly.This is due to several factors:<br />
1. People playing classic wow are probably a majority of veteran players who are good mannered.<br />
2. Buffs matter. Putting a buff on someone as you pass by is a way of saying hi in a meaningful way.<br />
3. You need to cooperate to beat stuff and being caustic isn't doing you any favors.<br />
<br />
<b>Respawning is something you need to pay attention to</b><br />
If you need to penetrate into an enemy camp and kill high level mobs to get there, you need to watch your back. Enemies are going to respawn behind you and could trap you. And... if you die in an enemy camp, you may not find a safe spot to revive.<br />
<br />
<b>Some non-dungeon areas require grouping with others</b><br />
I played a were-wolf area last night that required groups of people working together. I really want to complete every quest and there was no way I was completing those quests without the help of others. There was one quest (ambush) where I got what I needed and I just stuck around for another 15 minutes until everyone had a chance to complete it.<br />
<br />
<b>Money is tight</b><br />
Gold... OMG... It is hard to get this stuff. Having to earn money makes you appreciate it. You don't have enough to spend it on everything you want (training, profession, items) so you need to carefully choose what you want.<br />
<br />
<b>Leveling is slow</b><br />
It takes hours to go up one level. When you do level up, you stop to put a point in your talent tree... because those upgrades matter.<br />
<br />
<b>Quests are important and take time to complete</b><br />
In modern wow, I didn't pay much attention to quest text. In classic, I read it all because I know I'm not going to level out of an area before I complete the quests. Last night I was struggling to find anything to do in an area that I was not done with. That forced me to go into harder areas to complete lingering quests.<br />
<br />
<b>The death penalty is rough</b><br />
If you die, you may walk minutes to get back to your body. After dying a few times, you think really hard about that. I'd say it isn't quite as punishing as Dark Souls where you have to fight your way back to your body to get the resources you lost, but it is punishing.<br />
<br />
<b>Closing thoughts</b><br />
Wow classic is a solid old school game. Modern games try to hook you with quick leveling, no death penalties and fremium addictive RNG/Gambling aspects. Wow classic has none of that and it is refreshing.3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-233849615555045012017-10-25T07:39:00.000-07:002017-10-25T07:39:42.263-07:00The State of VRThe State of VR<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://roadtovrlive-5ea0.kxcdn.com/wp-content/uploads/2017/07/oculus-rift-touch-bundle-2017-5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="225" src="https://roadtovrlive-5ea0.kxcdn.com/wp-content/uploads/2017/07/oculus-rift-touch-bundle-2017-5.jpg" width="400" /></a></div>
<br />
<br />
Oculus Rift is clearly experiencing trouble selling their headset. In May they had to shut down their Film Studio and they've slashed the price of their headset several times.<br />
<br />
Is this a clear sign that VR is a failure?<br />
I don't think so.<br />
<br />
I am bullish on VR. It is not an if but a when. It is the when that is the issue.<br />
<br />
<b>Processing Power Limitations</b><br />
I think the problem is we don't have the processing power or appropriate pricing of that hardware for VR to become mainstream. To render each eye at 90 frames per second and deliver a AAA game experience is impossible with today's hardware. I have struggled with this a lot in my game design. I have taken the route of allowing the game to automatically adjust scene complexity based on frame rate. The result is little to no stutter but the visuals can't come close to approaching Destiny.<br />
<br />
<b>Similarities to Tablets</b><br />
When Tablets first hit the scene, the size of the screen was small, the interface was clunky and the processing power was not up to the task. Now everyone has a tablet. Technology and Software have arrived to allow us to have a powerful touch computer in our hands. VR is in a similar state. The hardware just isn't there and it is probably 10 years down the road before cheap fast hardware is available.<br />
<br />
<b>Saturated Market</b><br />
VR at this point is pretty saturated for what it can deliver. Because of hardware limitations it feels less like a gaming platform and more like a gimmick like the wii. Once you become accustomed to it, you find most experiences shallow and don't stack up to AAA titles.<br />
<br />
In the next few years we are likely going to see VR stagnate. This will continue until hardware becomes powerful enough<br />
<br />
<b>Standing vs Sitting</b><br />
One of the other problems with VR you need to stand for an immersive experience. This has already been done 3 times: wii, xbox and playstation. I think people are tired of setting up sensor bars and getting off the couch. You need to have a very compelling reason to get people off the couch and current VR hardware and software are not cutting it.<br />
<br />
<b>Summary</b><br />
All of this sounds pretty dire but I think this is good for VR developers who are in it for the long term. I do this as a hobby and don't have to worry about making money from VR. I can build the type of experience I want and know it will be unique because there is little competition in this space.3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com2tag:blogger.com,1999:blog-5059188873159121160.post-69901574145299622242017-09-25T06:15:00.001-07:002017-09-25T06:15:06.114-07:00Game Design ObservationsGame Design Observations<br />
<br />
My game is going to be large and open for the player to go in whatever direction they want. I've been playing Destiny 2 pretty heavily the last week and thought I'd look at some popular games and make some observations.<br />
<br />
Here are 5 games that I think are worth evaluating:<br />
<br />
<b>Destiny:</b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://boygeniusreport.files.wordpress.com/2017/07/destiny-2.jpg?quality=98&strip=all&w=782" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="440" data-original-width="782" height="225" src="https://boygeniusreport.files.wordpress.com/2017/07/destiny-2.jpg?quality=98&strip=all&w=782" width="400" /></a></div>
<br />
<br />
<b>Diablo:</b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://i.kinja-img.com/gawker-media/image/upload/s--NMoa6D03--/c_scale,fl_progressive,q_80,w_800/be6gu7y2lzdbdw4aoezs.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="225" src="https://i.kinja-img.com/gawker-media/image/upload/s--NMoa6D03--/c_scale,fl_progressive,q_80,w_800/be6gu7y2lzdbdw4aoezs.jpg" width="400" /></a></div>
<br />
<b>Zelda:</b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://static.gosunoob.com/img/1/2017/01/The-Legend-Of-Zelda-Breath-Of-The-Wild-Differences-Between-Versions.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://static.gosunoob.com/img/1/2017/01/The-Legend-Of-Zelda-Breath-Of-The-Wild-Differences-Between-Versions.jpg" data-original-height="450" data-original-width="800" height="225" width="400" /></a></div>
<br />
<b>Pokemon Go:</b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.destructoid.com//ul/447285-DEBYcLeXcAEy7oI-t.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="466" data-original-width="800" height="232" src="https://www.destructoid.com//ul/447285-DEBYcLeXcAEy7oI-t.jpg" width="400" /></a></div>
<br />
<b>Skyrim:</b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.geforce.com/sites/default/files-world/screenshots/elder-scrolls-v-skyrim/screenshot-8.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="225" src="https://www.geforce.com/sites/default/files-world/screenshots/elder-scrolls-v-skyrim/screenshot-8.jpg" width="400" /></a></div>
<br />
<br />
<b>What drives you to explore?</b><br />
Destiny: Search for better loot.<br />
Diablo: Search for better loot.<br />
Zelda: Search for better loot & Story<br />
Pokemon Go: Find rare Pokemon<br />
Skyrim: Quests. Loot is mostly irrelevant.<br />
<b><br /></b>
<b>How does your character level up?</b><br />
Destiny: Items (Light Level)<br />
Diablo: Experience & items<br />
Zelda: Experience<div>
Pokemon Go: Not relevant<br /><div>
Skyrim: Using the ability you want to level up</div>
<div>
<br /><b>What keeps you playing?</b><br />
Destiny: loot and friends playing together<br />
Diablo: trying to reach highest greater rift<div>
Zelda: end of story</div>
</div>
</div>
<div>
Pokemon Go: Find rare pokemon and level up existing ones</div>
<div>
Skyrim: Completing quests, finding new areas, raising character level</div>
<div>
<br /></div>
<div>
<b>What sucks?</b></div>
Destiny: Once you hit 260 light, it becomes a grind. You are often forced to use weapons you hate.<br />
Diablo: Once you reach Torment 10 or so, it becomes a grind. Power level has gotten out of control.<br />
Zelda: Weapons break.<br />
Pokemon Go: It is hard to find rare Pokemon<br />
Skyrim: Everything starts to look the same<br />
<br />
<b>What 1 improvement would I add?</b><br />
Destiny: A wider range of improvements on the high end. Light level should keep going to 400+ with high level content available to dedicated players.<br />
Diablo: Fix legendary gems. They are a storage nightmare.<br />
Zelda: I didn't finish it. It really didn't like constantly breaking weapons. This felt like Halo.<br />
Pokemon Go: Make the Pokemon locator work again... idiots.<br />
Skyrim: Make loot more valuable<br />
<br />
<b>Reflections on how to design my game:</b><br />
1. There needs to be something happening around you constantly.<br />
2. Enemies need to be frequent, varied<br />
3. Events should occur that you can find and complete<br />
4. You can find items/enemies via a locator<br />
5. Character level should be unlimited and driven off gear.<br />
6. Gear can be upgraded without a great hassle.<br />
7. There needs to be quests to complete with rewards.<br />
8. Areas of the game get harder as you go further driving you to improve your gear.3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-38660631852271362632017-09-18T05:32:00.001-07:002017-09-18T05:32:26.001-07:00Destiny 2 Graphics<h2>
Destiny 2 Graphics</h2>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://am23.akamaized.net/tms/cnt/uploads/2017/09/F83YpiMXCUkeyE6JQ4TXki.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="223" src="https://am23.akamaized.net/tms/cnt/uploads/2017/09/F83YpiMXCUkeyE6JQ4TXki.jpg" width="400" /></a></div>
<br />
<br />
I've played a lot of Destiny over the last few years. Yesterday I got the itch to play again so I picked up Destiny 2 ... and ... played it for most of the day.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://assets.vg247.com/current//2017/05/destiny_2_environments-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="225" src="https://assets.vg247.com/current//2017/05/destiny_2_environments-2.jpg" width="400" /></a></div>
<br />
Man... that game's graphics are amazing. I am officially intimidated by it.<br />
But again... they have spent hundreds of millions of dollars on it so I expect it but still...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://cdn.vox-cdn.com/uploads/chorus_asset/file/8546047/destiny_2_1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="225" src="https://cdn.vox-cdn.com/uploads/chorus_asset/file/8546047/destiny_2_1.jpg" width="400" /></a></div>
<br />
<br />
I think what they do is build the scene with a multi-texture material. When they are all done, anything that is static is converted into a single landscape mesh using that material. The result is stunning.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://assets.vg247.com/current//2017/05/destiny_2_environments-3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="225" src="https://assets.vg247.com/current//2017/05/destiny_2_environments-3.jpg" width="400" /></a></div>
<br />3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-7816763173676120122017-09-12T05:43:00.002-07:002017-09-12T07:58:27.887-07:00Working on Urban Layout<h2>
Working on Urban Layout</h2>
<br />
I've been working on an urban layout now that I know the scale I need to construct the world.<br />
<br />
Here is a sample I put together yesterday:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-uU7v3rtnUlA/WbfV46HNI2I/AAAAAAAADVw/VLJg9jAZ4zgxU78OUit2gdQNOqiNX6Y3QCLcBGAs/s1600/sample_city_layout_working.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="712" data-original-width="637" height="400" src="https://4.bp.blogspot.com/-uU7v3rtnUlA/WbfV46HNI2I/AAAAAAAADVw/VLJg9jAZ4zgxU78OUit2gdQNOqiNX6Y3QCLcBGAs/s400/sample_city_layout_working.jpg" width="357" /></a></div>
<br />
You can teleport in all directions forever and it will continue to build a random city with no stutter. This is obviously very primitive but I was more concerned with performance and how things looked at this scale and whether it would continue to look vast (it does).<br />
<br />
Next I am going add elevations for the urban layout and see what that looks like.<br />
<br />
Just for a bit of fun, I adjusted the layout to not have a road :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-rg9NgMFx_js/Wbf2CB2SsYI/AAAAAAAADWA/E5PXtZ1PO6Agz9jZ4eIbiy4kWVlCxvVCQCLcBGAs/s1600/sky_world_concept.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="714" data-original-width="639" height="400" src="https://3.bp.blogspot.com/-rg9NgMFx_js/Wbf2CB2SsYI/AAAAAAAADWA/E5PXtZ1PO6Agz9jZ4eIbiy4kWVlCxvVCQCLcBGAs/s400/sky_world_concept.jpg" width="357" /></a></div>
<br />3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-88552742406364585902017-09-10T05:32:00.001-07:002017-09-10T05:32:32.652-07:00Augmented vs Virtual Reality<h2>
Augmented vs Virtual Reality</h2>
<br />
I think there is a recent misconception that being able to walk around your house via inside-out tracking is the next big thing.<br />
<br />
In my mind, augmented and pure virtual experiences are different beasts. I think both are valid applications but a pure virtual experience is not going to have you walking around your house. You are going to need to be in a space that allows some freedom of movement but you are going to need to teleport around the virtual world for it to be immense.<br />
<br />
I am tired of virtual experiences that confine me to a space. I feel like I am on a stage and it breaks the immersion. The next generation of virtual reality experiences need to allow you to go in all directions indefinitely and not have crappy/low-res graphics.<br />
<br />
Having a world that unfolds infinitely in all directions allowing unlimited freedom of movement is the primary design decision for my upcoming game. That is what I want from virtual reality and so that is what I am going to deliver.<br />
<br />
It isn't easy. No it is not... but... my latest experiments show it is possible if you build a reality creation frameworks specifically for the needs of VR.3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-72038533461483272582017-09-09T12:52:00.003-07:002017-09-09T12:52:29.900-07:00Distance ResolvedI have basic elevation working and have resolved the distance rendering issue so that the world looks immense.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-NsLNLhq4mWE/WbRGdJGMEDI/AAAAAAAADVg/MoQbESDIsKErdRNOmfEIC2TlT-IyB7WOwCLcBGAs/s1600/distance_fixed.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="517" data-original-width="638" height="323" src="https://1.bp.blogspot.com/-NsLNLhq4mWE/WbRGdJGMEDI/AAAAAAAADVg/MoQbESDIsKErdRNOmfEIC2TlT-IyB7WOwCLcBGAs/s400/distance_fixed.jpg" width="400" /></a></div>
<br />3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-32660468887271547412017-09-05T20:23:00.001-07:002017-09-05T20:23:45.679-07:00Elevation is Working<h2>
Elevation is Working</h2>
<br />
Elevation is hard. Really hard.<br />
<br />
I got the basic framework for it working today. It works surprisingly well. I have a long way to go, but this is definitely a step in the right direction. I added an elevation that goes up and to the right indefinitely. I teleported around about 1/2 a mile up and it kept working like a champ.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/--u5zXttDLoc/Wa9pc-4cqwI/AAAAAAAADVQ/g_kjp7iLXBYxBHGX-ZlGZKjloINYqs5NACLcBGAs/s1600/elevation_example.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="482" data-original-width="638" height="301" src="https://4.bp.blogspot.com/--u5zXttDLoc/Wa9pc-4cqwI/AAAAAAAADVQ/g_kjp7iLXBYxBHGX-ZlGZKjloINYqs5NACLcBGAs/s400/elevation_example.jpg" width="400" /></a></div>
<br />3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-88279901879217000742017-09-04T07:42:00.004-07:002017-09-04T08:39:52.431-07:00Foliage Lag<h2>
Foliage Lag</h2>
<br />
I have foliage working again. I have disabled deletion of foliage for the moment but I have a plan on how to efficiently manage rebuilding foliage indexing if it is needed. The basic framework is in place for it.<br />
<br />
My bigger concern is trying to determine the most effective use of foliage.<br />
<br />
I made all my props foliage and noticed that large foliage objects (walls) create lag where non-foliage actors do not. This means foliage works best for smaller objects. It may be that foliage comes into play for an actor when it is further away from the player. That would be painful to implement so I'm just going to stick with foliage for small objects like grass for now.<br />
<br />
Foliage for grass did improve performance so it is working as expected.<br />
<br />
Today's task is fading the camera in and out for teleportation when I know it require significant adjustments to the scene. Knowing unreal, this will be a herculean task. It looks simple but I'm sure it is going to suck for some unforeseen reason.<br />
<br />
------------- UPDATE -------------<br />
<br />
I got the teleport fade out implemented in about an hour. It works very well. I only need to do it when I know a lot of processing is about to occur.<br />
<br />
After some experimentation, I have decided foliage is bad for performance. Frame rate starts out great and you think foliage is helping. But... I started getting low frame rates after teleporting around a while. I removed the foliage and voila, frame rate never went low again.<br />
<br />
This is really unfortunate. I probably spent several weeks carefully incorporating foliage into my framework. Oh well.3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-91597239773578671722017-09-03T09:23:00.000-07:002017-09-03T09:23:02.878-07:00Distributing Processing Over Time<h2>
Distributing Processing Over Time</h2>
Since the game now adjusts its quality automatically, I can try out different strategies and see which ones improve game quality.<br />
<br />
My first change was to distribute load over time. I changed my world generation logic to queue changes instead of processing them all at once. About 10% of the queue is then processed every frame/tick.<br />
<br />
This had an amazing improvement in performance. It improved quality by a factor of 4!<br />
<br />
This evening I will changing my foliage logic and see how that changes the quality.3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-40044701486259641762017-09-02T09:40:00.002-07:002017-09-02T09:40:30.268-07:00Automatic Quality Adjustment<h2>
Automatic Quality Adjustment</h2>
<div>
Everything in my game is dynamically added as the player moves around the world. I've been thinking about how to automatically improve FPS (Frames Per Second) by adding logic to the game mode tick.</div>
<div>
<br /></div>
<div>
I did that today and it works amazingly well. The game now monitors FPS and if it dips below 80, it slowly reduces game quality settings until it is at least 80 FPS. I also have it automatically improve quality if FPS goes above 85.</div>
<div>
<br /></div>
<div>
I teleported around the world for several minutes and there was no stutter. It was interesting to see what settings the game settled on versus what I thought was acceptable. It was much lower but my FPS stabilized at 85. I know 85 is below the recommended 90, but 85 looks fine to me.</div>
<div>
<br /></div>
<div>
This means the game will automatically adjust itself based on the player's graphics card without them having to adjust any settings.</div>
<div>
<br /></div>
<div>
Next I will rewrite my foliage logic and see what quality settings the games adjusts itself to. I expect it to get better.</div>
3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-37322440006939731882017-08-27T22:15:00.002-07:002017-08-27T22:15:47.613-07:00Foliage Gotcha<h2>
Foliage Gotcha</h2>
<br />
Foliage is a copy of a mesh that renders very fast. All foliage based on a mesh render the same way except they have a different location, rotation and scale. This allows you to put a lot more items on the screen.<br />
<br />
When you add foliage, you get an index. That index matches an entry in an array on the parent mesh the foliage is based on. Problem is, if you delete any foliage, the arrays shrinks invalidating the indexes you were previously given. I did find a way around this issue but in the end, the performance downside of managing foliage indexing outweighs the performance gain from using foliage.<br />
<br />
More work is needed in this area, but for now, I am disabling foliage on all my meshes.<br />
<br />
Exactly what was unreal thinking when they designed this? The only handle you have to the foliage is an index they give you. That index can be invalidated by deleting any other foliage. wtf?<br />
<br />
I have spent a LOT of time incorporating foliage into my framework. I think I may have to stop using it unless I stop deleting foliage unless it is absolutely necessary.3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-36605738462510966572017-08-21T19:00:00.006-07:002017-08-21T19:00:46.343-07:00Missing UPROPERTY woes<h2>
Missing UPROPERTY woes</h2>
<br />
Over the last few days I have rewritten my world coordinate system. This was no small task affecting everything in a profound way.<br />
<br />
I was testing it and Unreal blew up with a memory allocation issue. I had no idea what was going on but running out of memory this early in development is very frightening. I tried it again and eventually it blew up again in a different location with a memory allocation issues.<br />
<br />
I did 2 memory dumps, one when it started and one after moving around a while and saw nothing unusual.<br />
<br />
Then I decided to review all my code for missing UPROPERTY. UPROPERTY is a pre-compilation macro that tells Unreal that it needs to manage the variable in memory versus destroying it on a whim.<br />
<br />
I found 2 missing UPROPERTY variables.<br />
<br />
Once I fixed those everything was fine again.<br />
<br />
That is <u>very</u> scary. I need to have a strategy of isolating all member variables for a class at the top of the header file and review them occasionally to ensure every one of them is a UPROPERTY.3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-11683862227895105242017-08-20T07:04:00.000-07:002017-08-20T07:04:13.413-07:00Vive Controller Jitters<h2>
Vive Controller Jitters</h2>
<br />
Well, I discovered something new last night. I didn't know exactly what it was until I did some experimentation.<br />
<br />
If you move your character past coordinate 100,000 or so in any direction, the controller starts to shake. It continues to get worse as you go past that. Lets just say at 9,000,000, it is very painful.<br />
<br />
I suppose unreal never noticed this since most people build VR games within a tiny play space.<br />
<br />
This means I will need to keep re-positioning the player within 100,000 Unreal coordinate space. I can build the world beyond that but the player needs to stay within there. This is doable based on the way I construct the world, but I've got to rewrite some code I thought was finished...3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-84914811818079345922017-08-18T19:05:00.000-07:002017-08-18T19:05:14.317-07:00Teleport Arc Rumble<h2>
Teleport Arc Rumble</h2>
<br />
What I thought was going to be a 1 hour task turned into a deep dark black hole of hell.<br />
<br />
I did not find a single example of someone successfully rumbling the Vive controller from C++.<br />
<br />
I have code that should work but it does not and I am tired of fighting with it right now.<br />
<br />
So... I went the opposite route and worked on calling a blueprint method (which I know works) from C++. That was an extreme pain as well.<br />
<br />If you construct a blueprint object via Spawn it will not call blue print methods.<br />
<br />
I had to resort to dropping a blueprint actor (that subclassed a C++ class I created) into the scene and then find it once the game started. That gave me the ability to call blue print custom events.<br />
<br />
Unreal fights me every inch of the way...3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-7463620000796076052017-08-17T14:21:00.001-07:002017-08-17T14:21:17.795-07:00Vive Teleport in C++ : Wrap Up<h2>
Vive Teleport in C++ : Wrap Up</h2>
<br />
I've finished the visual piece of the teleport. Here is a combined screen shot of failure and success:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-BZz8SNDibZ4/WZYHKgzKlQI/AAAAAAAADTw/ncCysznzkI0kR0UdlLWNGdEJoNqKir9xgCLcBGAs/s1600/teleport_works.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="715" data-original-width="638" height="400" src="https://1.bp.blogspot.com/-BZz8SNDibZ4/WZYHKgzKlQI/AAAAAAAADTw/ncCysznzkI0kR0UdlLWNGdEJoNqKir9xgCLcBGAs/s400/teleport_works.jpg" width="356" /></a></div>
<br />
Notice how the red teleport circle matches the normal of the plane it hits.<br />
<br />
It is snappy, completely in C++ and does not rely on the overhead of the navigational mesh that comes with the Unreal example. It only relies on the teleport meshes I have on the screen.<br />
<br />
My goal is to match the gold standard that is Valve's VR Room. That is the level of polish I want for my game. It looks simple and feels natural.<br />
<br />
Hats off to Valve for pushing VR tech forward so that we can have a holodeck for the home.<br />
<br />
Next is to actually teleport and polish my world generation logic.3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-87746203243735635182017-08-16T14:17:00.001-07:002017-08-16T19:53:04.075-07:00Vive Teleporter in C++ : Part 3Vive Teleporter in C++ : Part 3<br />
<br />
I have the teleport arc working in C++<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-WbmF-jZ6exM/WZS1lFBfsqI/AAAAAAAADTg/OS2MvhYFSk4fQLRI0mVhQwhd5lNyzOVoACLcBGAs/s1600/teleport_arc.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="710" data-original-width="636" height="400" src="https://4.bp.blogspot.com/-WbmF-jZ6exM/WZS1lFBfsqI/AAAAAAAADTg/OS2MvhYFSk4fQLRI0mVhQwhd5lNyzOVoACLcBGAs/s400/teleport_arc.jpg" width="357" /></a></div>
<br />
Problem is that it doesn't collide with anything on the screen, only the static nav mesh that came with the example. I left that under my world construction so I can teleport around with the old code. My goal is to get rid of it so I'm going to need to change this...<br />
<br />
From what I understand, there are collision channels. I need to put all my non-plant meshes in a custom collision channel and use that for detection. Or... at least that is the theory.<br />
<br />
I think I am going to have to rip this code out of unreal and customize it at some point but if I can avoid that for a while I will.<br />
<br />
....<br />
<br />
Tracing this arc only seems to work for static meshes predefined in the level.<br />
<br />
The trace logic is a black box to me. It leaves me no choice but to copy all the tracing logic into a utility class I control and start figuring wtf is going on here.<br />
<br />
Unreal has no end to the pain it puts me through.<br />
<br />
...<br />
<br />
I think I have this figured out. I created a utility class and moved these 2 methods into it:<br />
Blueprint_PredictProjectilePath_ByObjectType and PredictProjectilePath<br />
<br />
I then altered PredictProjectilePath to force a channel trace instead of ObjectType trace.<br />
<br />
That hit every mesh on the screen.<br />
<br />
I then added a tag to each mesh.<br />
<br />
Next came collision. I switched ground and walls to complex collision on the mesh.<br />
<br />For the teleport areas, they are planes and Unreal's collision mesh didn't work. I had to add a collision mesh for the teleport planes. Once I did this, the channel trace found it and identified the teleport areas.<br />
<br />
Now it is just a matter of clean up and moving onto adding an end point that matches Valve's VR implementation.<br />
<br />
I am getting occasional stutter, but I think it is the log spewing out too much info.3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-80739661687336365242017-08-16T04:29:00.000-07:002017-08-16T04:29:13.976-07:00Vive Teleporter in C++ : Part 2Vive Teleporter in C++ : Part 2<br />
<br />
Mapping controller buttons into code went very well.<br />
<br />
Now onto the teleport arc. Here is the code in blueprint:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-nRKt7GY_gu4/WZQqv3h3aiI/AAAAAAAADTQ/ub6GZ5Sq-zcej1urGZnStCEpAd1SDGmBgCLcBGAs/s1600/arc_logic.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="557" data-original-width="1005" height="221" src="https://1.bp.blogspot.com/-nRKt7GY_gu4/WZQqv3h3aiI/AAAAAAAADTQ/ub6GZ5Sq-zcej1urGZnStCEpAd1SDGmBgCLcBGAs/s400/arc_logic.jpg" width="400" /></a></div>
<br />
Everything is flowing in and out of that big blue-header box.<br />
<br />
I found the method:<br />
UGameplayStatics::Blueprint_PredictProjectilePath_ByObjectType<br />
<br />
That thing takes in 16 parameters!<br />
<br />Who the hell names a method Blueprint_ ?<br />
<br />
Fortunately we can see all of them on the screen but 1. Some of the parameters are output parameters. I actually have my code calling this method on teleport button press and getting 60 points back that appear to be along an arc. Now I just need to build a spline based on these points.<br />
<br />
Since nobody on the planet seems to be calling this method from C++, let me help you:<br />
<br />
UObject* WorldContextObject = GetWorld();<br />
<br />
Location = RightMotionController->GetComponentLocation(); ForwardVector = RightMotionController->GetForwardVector();<div>
<br />// INPUT --------------------------<br />
FVector StartPos = Location;<br />
float Velocity = 900.0f;<br />
FVector LaunchVelocity = UKismetMathLibrary::Multiply_VectorFloat(ForwardVector, Velocity);<br />
bool bTracePath = true;<br />
float ProjectileRadius = 0.0f;<br />
TArray<TEnumAsByte<EObjectTypeQuery>> ObjectTypes;<br />
ObjectTypes.Add(EObjectTypeQuery::ObjectTypeQuery1);<br />
bool bTraceComplex = false;<br />
const TArray<AActor*> ActorsToIgnore;<br />
EDrawDebugTrace::Type DrawDebugType = EDrawDebugTrace::None;<br />
float DrawDebugTime = 0.0;<br />
float SimFrequency = 30.0;<br />
float MaxSimTime = 2.0;<br />
float OverrideGravityZ = 0.0;<br />
<br />
// OUTPUT --------------------------<br />
FHitResult OutHit;<br />
TArray<FVector> OutPathPositions;<br />
FVector OutLastTraceDestination;<br />
<br />
bool HitSomething = UGameplayStatics::Blueprint_PredictProjectilePath_ByObjectType(<br />
<span style="white-space: pre;"> </span>WorldContextObject,<br />
<span style="white-space: pre;"> </span>OutHit,<br />
<span style="white-space: pre;"> </span>OutPathPositions,<br />
<span style="white-space: pre;"> </span>OutLastTraceDestination,<br />
<span style="white-space: pre;"> </span>StartPos,<br />
<span style="white-space: pre;"> </span>LaunchVelocity,<br />
<span style="white-space: pre;"> </span>bTracePath,<br />
<span style="white-space: pre;"> </span>ProjectileRadius,<br />
<span style="white-space: pre;"> </span>ObjectTypes,<br />
<span style="white-space: pre;"> </span>bTraceComplex,<br />
<span style="white-space: pre;"> </span>ActorsToIgnore,<br />
<span style="white-space: pre;"> </span>DrawDebugType,<br />
<span style="white-space: pre;"> </span>DrawDebugTime,<br />
<span style="white-space: pre;"> </span>SimFrequency,<br />
<span style="white-space: pre;"> </span>MaxSimTime,<br />
<span style="white-space: pre;"> </span>OverrideGravityZ<br />
<span style="white-space: pre;"> </span>);</div>
3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-53336455658289270072017-08-15T05:03:00.001-07:002017-08-15T05:05:08.596-07:00Vive Teleporter in C++<h2>
Vive Teleporter in C++</h2>
<br />
I've been programming a long time and I must admit the teleport blueprint example from Unreal is very intimidating. Converting this to C++ feels like a major task<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-R-AqYRDf5ro/WZLhUH25XKI/AAAAAAAADS4/9ctNkh15eToZhnvmXxAysQoAJvKMf_qsQCLcBGAs/s1600/teleport_blueprint.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="869" data-original-width="1160" height="239" src="https://1.bp.blogspot.com/-R-AqYRDf5ro/WZLhUH25XKI/AAAAAAAADS4/9ctNkh15eToZhnvmXxAysQoAJvKMf_qsQCLcBGAs/s320/teleport_blueprint.jpg" width="320" /></a></div>
<br />
It reminds me of an airplane cockpit:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://s-media-cache-ak0.pinimg.com/originals/3e/99/ce/3e99ceb3c5dadc106998d8087f42bd5e.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="180" src="https://s-media-cache-ak0.pinimg.com/originals/3e/99/ce/3e99ceb3c5dadc106998d8087f42bd5e.jpg" width="320" /></a></div>
<br />
<br />
Well... with anything big, you eat it one bite at a time.<br />
<br />
The first bite was getting VIVE controllers into my game in C++. That was easier than I thought and covered in a prior post.<br />
<br />
The second bite is firing off my C++ code when buttons are pressed.<br />
<br />
This is a great article on doing this:<br />
<a href="http://jonaskunze.com/accessing-htc-vive-controllers-from-c-in-ue4-4-13-and-4-14/">http://jonaskunze.com/accessing-htc-vive-controllers-from-c-in-ue4-4-13-and-4-14/</a><br />
<br />
I don't want to break the existing teleport example in Unreal so I have to figure out which buttons are already mapped and use event names instead of the ones in that example. Eventually I will rename the event names to be generic but that will be a last step in the process.<br />
<br />
I think this image is very helpful:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-BrROaO8O5MM/WZLiB-wE5rI/AAAAAAAADTA/RbRlZLB4XkojhYwC6eI4TV2l9ZANQXEFwCLcBGAs/s1600/jgdRuzt.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1024" data-original-width="1024" height="320" src="https://3.bp.blogspot.com/-BrROaO8O5MM/WZLiB-wE5rI/AAAAAAAADTA/RbRlZLB4XkojhYwC6eI4TV2l9ZANQXEFwCLcBGAs/s320/jgdRuzt.png" width="320" /></a></div>
<br />
I compared the button mappings in my current DefaultInput.ini, to what that article listed. Here is what I have:<br />
<br />
Action Mappings:<br />
TeleportRight (RightTouchpadPress) = MotionController_Right_Thumbstick<br />
TeleportRight (RightTouchpadUp) = MotionController_Right_FaceButton1<br />
GrabLeft (LeftTrigger) = MotionController_Left_Trigger<br />
GrabRight (RightTrigger) = MotionController_Right_Trigger<br />
TeleportLeft (LeftTouchpadPress) = MotionController_Left_Thumbstick<br />
TeleportLeft (LeftTouchpadUp) = MotionController_Left_FaceButton1<br />
HMDTeleport<br />
<br />
Axis Mappings:<br />
TeleportDirectionUp = Gamepad_LeftY<br />
TeleportDirectionRight = Gamepad_LeftX<br />
MotionControllerThumbLeft_Y (LeftTouchpadY) = MotionController_Left_Thumbstick_Y<br />
MotionControllerThumbLeft_X (LeftTouchpadX) = MotionController_Left_Thumbstick_X<br />
MotionControllerThumbRight_Y (RightTouchpadY) = MotionController_Right_Thumbstick_Y<br />
MotionControllerThumbRight_X (RightTouchpadX) = MotionController_Right_Thumbstick_X<br />
<br />
The name on the left is what the Unreal teleport example calls it.<br />
The name in parens is what the article calls it.<br />
The value on the right is the actual action/axis event.<br />
<br />
To start with, I am going to use these and add methods for each of them in my Pawn code. It recommend a Character class. Character just extends Pawn and adds more human locomotion logic. If I need to, I will change my base class to Character, but for the moment I am sticking with Pawn.<br />
<br />
This was a reddit post discussing Pawn vs Character for reference:<br />
<a href="https://www.reddit.com/r/unrealengine/comments/2yo13c/a_question_on_the_acharacter_vs_apawn_conundrum/">https://www.reddit.com/r/unrealengine/comments/2yo13c/a_question_on_the_acharacter_vs_apawn_conundrum/</a>3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-73039122412784166152017-08-14T13:46:00.002-07:002017-08-14T13:48:38.138-07:00How to set up Vive controllers in Unreal in C++<h2>
How to set up Vive controllers in Unreal in C++</h2>
<div>
<br /></div>
<div>
I am going to show you exactly how to set up HTC Vive controllers in Unreal 4 using C++. </div>
<div>
<br /></div>
<div>
This was a pain in the ass with snippets of code and information scattered everywhere. This may be easy for seasoned UE4 developers. For noobs like myself, it was not. The Blueprint hides things and does not explain how this is done in C++.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-Ftr0Yn9neSA/WZIIBnZMNdI/AAAAAAAADSo/O7DznX0IPe0X45kqvhJ11pV7YoPjkC1gACLcBGAs/s1600/controller_in_ue4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="704" data-original-width="630" height="400" src="https://2.bp.blogspot.com/-Ftr0Yn9neSA/WZIIBnZMNdI/AAAAAAAADSo/O7DznX0IPe0X45kqvhJ11pV7YoPjkC1gACLcBGAs/s400/controller_in_ue4.jpg" width="357" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h3>
Prerequsite:</h3>
</div>
<div>
You need a custom game mode working you can write logic into its BeginPlay() method.</div>
<div>
<br /></div>
<div>
<h3>
1. Import the Vive 3D controller into blender.</h3>
<br /></div>
<div>
Watch this video: <a href="https://www.youtube.com/watch?v=Nf4wMwUZSfM">https://www.youtube.com/watch?v=Nf4wMwUZSfM</a></div>
<div>
Steam\steamapps\common\SteamVR\resources\rendermodels\vr_controller_vive_1_5\</div>
<div>
vr_controller_vive_1_5.obj</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h3>
2. Export the Vive 3D controller as fbx</h3>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h3>
3. Import the Vive 3D controller and 2 related textures</h3>
</div>
<div>
<br /></div>
<div>
C:\Program Files (x86)\Steam\steamapps\common\SteamVR\resources\rendermodels\vr_controller_vive_1_5</div>
<div>
<div>
onepointfive_occ_bake.tga</div>
<div>
onepointfive_texture.png</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h3>
4. Build a material. I tweaked it to use a custom wood material</h3>
</div>
<div>
<br /></div>
<div>
I assume you know how to make a material...</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h3>
5. Set the material on the 3D controller</h3>
</div>
<div>
<br /></div>
<div>
This is pretty straight forward...</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
6. Add HeadMountedDisplay to PublicDependencyModuleNames in your GameName.build.cs file</div>
<div>
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "Foliage", "InputCore", "HeadMountedDisplay" });</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h3>
7. Create a C++ Pawn using UE4</h3>
</div>
<div>
<br /></div>
<div>
This is pretty straight forward...</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h3>
8. Add 3 UPROPERTY Variables to the pawn class:</h3>
</div>
<div>
<br /></div>
<div>
<div>
<span style="white-space: pre;"> </span>UPROPERTY(EditAnywhere)</div>
<div>
<span style="white-space: pre;"> </span>USceneComponent* OurVisibleComponent;</div>
<div>
<br /></div>
<div>
<span style="white-space: pre;"> </span>UPROPERTY(EditDefaultsOnly)</div>
<div>
<span style="white-space: pre;"> </span>class UMotionControllerComponent* LeftMotionController;</div>
<div>
<br /></div>
<div>
<span style="white-space: pre;"> </span>UPROPERTY(EditDefaultsOnly)</div>
<div>
<span style="white-space: pre;"> </span>class UMotionControllerComponent* RightMotionController;</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h3>
9. Flesh out the Pawn constructor</h3>
</div>
<div>
<div>
<br /></div>
<div>
<span style="white-space: pre;"> </span>// Set the player to be represented by this pawn</div>
<div>
<span style="white-space: pre;"> </span>AutoPossessPlayer = EAutoReceiveInput::Player0;</div>
</div>
<div>
<div>
<span style="white-space: pre;"> </span>RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));</div>
<div>
<br /></div>
<div>
<span style="white-space: pre;"> </span>LeftMotionController = CreateDefaultSubobject<UMotionControllerComponent>(TEXT("LeftMotionController"));</div>
<div>
<span style="white-space: pre;"> </span>LeftMotionController->Hand = EControllerHand::Left;</div>
<div>
<span style="white-space: pre;"> </span>LeftMotionController->SetupAttachment(RootComponent);<span style="white-space: pre;"> </span></div>
<div>
<span style="white-space: pre;"> </span></div>
<div>
<span style="white-space: pre;"> </span>RightMotionController = CreateDefaultSubobject<UMotionControllerComponent>(TEXT("RightMotionController"));</div>
<div>
<span style="white-space: pre;"> </span>RightMotionController->Hand = EControllerHand::Right;</div>
<div>
<span style="white-space: pre;"> </span>RightMotionController->SetupAttachment(RootComponent);</div>
<div>
<br /></div>
<div>
<span style="white-space: pre;"> </span>UCameraComponent* OurCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("PlayerCameraComponent"));</div>
<div>
<span style="white-space: pre;"> </span>OurCamera->SetupAttachment(RootComponent);</div>
<div>
<br /></div>
<div>
<span style="white-space: pre;"> </span>// TODO: Add SteamVRChaperone bounds</div>
<div>
<span style="white-space: pre;"> </span>// TODO: Set Tracking Origin to floor for Vive</div>
<div>
<br /></div>
<div>
<span style="white-space: pre;"> </span>BaseEyeHeight = 0.0f;</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h3>
10. Flesh out the Pawn BeginPlay</h3>
</div>
<div>
<div>
<br /></div>
<div>
<span style="white-space: pre;"> </span>FTransform SpawnTransform = FTransform(FRotator(0.0f, 90.0f, 0.0f), FVector(0.f, 0.f, 0.f), FVector(0.120f, 0.120f, 0.120f));</div>
<div>
<span style="white-space: pre;"> </span>// AGeneratedActor sets the mesh and material in its constructor</div>
<div>
<span style="white-space: pre;"> </span>AGeneratedActor* LeftControllerActor = GetWorld()->SpawnActor<AGeneratedActor>(AGeneratedActor::StaticClass(), SpawnTransform);</div>
<div>
<span style="white-space: pre;"> </span>LeftControllerActor->AttachToComponent(LeftMotionController, FAttachmentTransformRules::KeepRelativeTransform);</div>
<div>
<br /></div>
<div>
<span style="white-space: pre;"> </span>SpawnTransform = FTransform(FRotator(0.0f, 90.0f, 0.0f), FVector(0.f, 0.f, 0.f), FVector(0.120f, 0.120f, 0.120f));</div>
<div>
<span style="white-space: pre;"> </span>AGeneratedActor* RightControllerActor = GetWorld()->SpawnActor<AGeneratedActor>(AGeneratedActor::StaticClass(), SpawnTransform);</div>
<div>
<span style="white-space: pre;"> </span>RightControllerActor->AttachToComponent(RightMotionController, FAttachmentTransformRules::KeepRelativeTransform);</div>
</div>
<div>
<br />
<br /></div>
<div>
<h3>
11. Spawn the Pawn in the GameMode BeginPlay()</h3>
<br /></div>
<div>
<div>
<span style="white-space: pre;"> </span>FTransform SpawnTransform = FTransform(FRotator(0.0f, 0.0f, 0.0f), FVector(400.f, 550.f, 105.f), FVector(1.0f, 1.0f, 1.0f));</div>
<div>
<span style="white-space: pre;"> </span>ASeanPawn* MyPawn = GetWorld()->SpawnActor<ASeanPawn>(ASeanStepPawn::StaticClass(), SpawnTransform);</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h3>
12. Voila</h3>
</div>
<div>
<br /></div>
<div>
I know I didn't cover the creation of an Actor with a Mesh. This is pretty straight forward thing. If you have constructed any meshes in C++, you should know how to do this.</div>
<div>
I had to adjust rotation and scale of the model until it felt right. You will need to do the same.</div>
<div>
<br /></div>
3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-56376055340567558022017-08-14T05:48:00.001-07:002017-08-14T06:07:13.888-07:00Unreal 4 Tips<h2>
Unreal 4 C++ Tips</h2>
<br />
Are you starting a new game with Unreal 4? Are you looking to write it in C++?<br />
<br />
Let me help by giving you some tips that I've learned over the last few months.<br />
<br />
<br />
<b>1. Get used to the Unreal engine blowing up. A lot.</b><br />
<br />
If you do anything wrong, the engine will blow up. It won't pop up and error and gracefully move on. It will explode with a stack trace (if you are lucky). This is normal behavior. I've never done C++ game development before, so maybe this is normal, but it is not normal for production code in business applications (which is my day job). In business applications you wrap exceptions with a catch and gracefully move around an issue.<br />
<br />
Because it blows up a lot, you need to be used to building from Visual Studio. Get in a habit of compiling there.<br />
<br />
<br />
<b>2. If your class is intended to live in the engine, you MUST extend one of their classes and make each of your variables a UPROPERTY. </b><br />
<br />
If you do not it WILL garbage collect your variables and you will slowly go out of your mind. It took me days to figure out wtf was going on and a few more days of converting my code to extend UObject and pray the fix worked (and it did).<br />
<br />
class YEGAME_API UMyClass : public UObject {<br />
GENERATED_BODY()<br />
public:<br />
UPROPERTY()<br />
UAnotherClass* MyObject;<br />
}<br />
<br />
<br />
<b>3. Any class that extend one of their classes is under the control of the Unreal Engine. </b><br />
<br />
You cannot construct it. This is so they can track instances of it for memory management and garbage collection. Get used to this syntax. It is your lifeblood for creating objects:<br />
<br />
UGameTime* CurrentGameTime = NewObject<UGameTime>();<br />
<br />
This means everything is a memory pointer. I'm ok with that. At least it is consistent.<br />
<br />
<br />
<b>4. The name of a mesh and material must be fully pathed in the constructor of an Actor.</b><br />
<br />
AGeneratedActor::AGeneratedActor(const class FObjectInitializer& PCIP) : Super(PCIP) {<br />
...<br />
static ConstructorHelpers::FObjectFinder<UStaticMesh> StaticMesh(TEXT("StaticMesh'/Game/StarterContent/Props/SM_Rock.SM_Rock'"));<br />
...<br />
static ConstructorHelpers::FObjectFinder<UMaterial> Material(TEXT("Material'/Game/StarterContent/Props/Materials/M_Rock.M_Rock'"));<br />
<br />
<br />
<b>5. You CAN tell the Actor constructor what mesh/material you want via a singleton. </b><br />
<br />
I will leave it to you to sort that out, but that is a huge hint to get around their frustrating Actor construction API.<br />
<br />
<br />
<b>6. Foliage materials must have this damn check mark checked: "Used with Instanced Static Meshes"</b><br />
<br />
I probably wasted a week on that one thing.<br />
<br />
<br />
<b>7. Foliage cannot handle transparent materials</b><br />
<b><br /></b>
Makes sense I guess. BTW, transparency is the enemy of fluid performance. If you have a lot of transparency on screen, you will get stutter. You should use it VERY sparingly.<br />
<b><br /></b>
<b><br /></b>
<b>8. Lighting of Foliage Meshes is the same for all instances. </b><br />
<b><br /></b>
This can be weird and I do not use it for ground.<br />
<br />
<br />
<b>9. The coordinate system for Unreal is Y over and X up. </b><br />
<br />
This is called a Left Handed coordinate system and bears no resemblance to mathematical coordinate systems that are X over and Y up. Blender uses the correct coordinate system. Blender gets a cookie. Unreal? They do not get a cookie.<br />
<br />
From everything I've read on it, it is Microsoft's fault. DirectX operates this way because it was originally for flight simulators which are traditionally Left Coordinate systems.<br />
<br />
I don't care what your excuse is, Y over and X up is pure insanity. There is no excuse for this. It is X over, Y up and Z in the 3rd dimension. Kinda like a tabs versus spaces argument (tabs are correct btw...). If you are putting objects on the screen via C++ code, you need to know this upfront.<br />
<br />
<br />
<b>10. Unreal cannot handle nested variables</b><br />
<br />
You cannot do this: TArray<TArray><br />
<br />
I guess this is hard to implement. Java, C++ Structs and Ruby can do it. I use nested containers all the time. I don't quite understand this quirk.<br />
<br />
There is a way around this. You create a class that has your second container on it as a UPROPERTY. I do this in my game and it works like a champ.<br />
<br />
<br />
<b>11. What is up with these damn macros?</b><br />
<br />
I'm talking about these:<br />
DECLARE_LOG_CATEGORY_EXTERN(YeLogName, Log, All);<br />
UCLASS()<br />
GENERATED_BODY()<br />
UPROPERTY()<br />
<br />
You probably know this, but your code is pre-processed into a new class before compilation. All those "myclass.generated.h" are the result of this. They are found in the intermediate folder.<br />
<br />
When writing a new class, you can include the "generated.h" header even though it doesn't exist.<br />
<br />
Expect nothing to highlight correctly in Visual Studio until everything compiles. Even then, Visual Studio is often confused.<br />
<br />
If you code works, that is the true test.<br />
<br />
<br />
<b>12. Logging is painful</b><br />
<br />
OMG is it annoying. Each class must have its own logger and everything must be converted perfectly for it to log.<br />
<br />
If you pass the wrong type, the log may show a variable from a prior log that was for that type. That drove me crazy for a while. Also, don't forget to * your FString variable when logging it.<br />
<br />
This is a great page on logging:<br />
<a href="https://wiki.unrealengine.com/Logs,_Printing_Messages_To_Yourself_During_Runtime">https://wiki.unrealengine.com/Logs,_Printing_Messages_To_Yourself_During_Runtime</a><br />
<br />
<b>13. And finally, never give up and never surrender.</b><br />
<br />
You want to make a C++ game for Unreal? Well, its gonna suck. Hard. But... it doesn't suck as hard as writing a game engine from scratch. Now that I've got a lot of C++ code in place, I encounter a lot fewer explosions or surprises.<br />
<br />
I like to think as Unreal as my team of engineers adding new features for me. It is painful to get started but they are a large team working for you. They have given you their entire code base to look through.<br />
<br />
Hopefully this helps someone. If I knew all of this, it would have save me weeks of pain and suffering.3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0tag:blogger.com,1999:blog-5059188873159121160.post-69911880850896501992017-08-14T05:18:00.003-07:002017-08-14T05:18:15.195-07:00New VR Title UnderwayI've been coding a new Vive Room-scale VR game for the last few months using Unreal 4. When I am finished, all game code will be in C++. All of it is currently in C++ except teleportation which I will be rewriting in C++ in the next few weeks.<br />
<br />
I've been in the planning phase for it for over a year.<br />
<br />
I have solved the infinite sized world problem with no stutter, no load times, teleport meshes, dynamic lighting and sounds. It also allows a user to customize scene complexity based on the speed of their machine. This game will be able to scale up to hardware that doesn't exist yet.<br />
<br />
Here is a sample screen shot of a maze I put together this weekend using the framework:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-9axgzwx73XI/WZGS0ihPxHI/AAAAAAAADSY/tAabTELBifcORvM5uwxRbu1EgpmsI8tuACLcBGAs/s1600/preview_2017_08_14.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="710" data-original-width="627" height="640" src="https://3.bp.blogspot.com/-9axgzwx73XI/WZGS0ihPxHI/AAAAAAAADSY/tAabTELBifcORvM5uwxRbu1EgpmsI8tuACLcBGAs/s640/preview_2017_08_14.jpg" width="564" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
I expect this game to take 2-4 years to complete. Being a one man team doing this in my off hours means things take time to complete.</div>
3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com1tag:blogger.com,1999:blog-5059188873159121160.post-32217891227488382432016-12-18T08:44:00.000-08:002016-12-18T08:44:08.960-08:00Windows 10 - I hate you<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-wSEReJ9oTVA/WFa6cgICxNI/AAAAAAAADL8/FKz9xXjua0YJEU5QIGTZQgSdmrbp3zF5wCLcB/s1600/Angry-PC-user-e1442570909438.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="https://2.bp.blogspot.com/-wSEReJ9oTVA/WFa6cgICxNI/AAAAAAAADL8/FKz9xXjua0YJEU5QIGTZQgSdmrbp3zF5wCLcB/s400/Angry-PC-user-e1442570909438.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
If you've used windows for a long time, you may find it has become less friendly over time.<br />
<br />
That is putting it mildly.<br />
<br />
Every release changes where settings are and what they are called. I swear it is in an effort to make it difficult for you to find a web page with instructions on how to disable stuff easily...<br />
<br />
Windows 10 is the pinnacle of constant annoyance.<br />
<br />
Let me list off the things that annoy me or have caused me grief:<br />
<br />
<b>1. The start menu can't be customized.</b><br />
WTF? I can't drag stuff onto the start menu anymore? Windows 95 was honestly the best version of the start menu. Seriously. It has just become a platform for Microsoft advertising with all their crap on the right. It can be replaced with classic shell which I inevitably do on every install of windows.<br />
<br />
<b>2. The upgrade to windows 10 stopped my gaming rig from working. </b><br />
My high end gaming rig would get into an infinite reboot loop until I restored from a prior save spot. Upon boot it would immediately reapply updates. You could unplug the network cable but I usually forgot and it was faster than I was. Guess what happened to that save point? It was erased by windows with no fallback. I had to reinstall windows 7. After yelling at it for a while, this was actually a relief. That computer is not longer affected by the scourge that is windows 10.<br />
<br />
<b>3. The start menu search dialog is gone (how you easily find software on your machine).</b><br />
You have no choice (unless you install classic shell) to use Cortana. This is just a cheap excuse by Microsoft to track your search criteria and present you with software from their site in hopes of grabbing more revenue.<br />
<br />
<b>4. It secretly installs XBOX services</b><br />
These services will attempt to capture images and videos when you play games. I didn't know this until Diablo III would constantly blow up. I was like, WTF is going on? I researched it and it is the XBOX service that is causing it. To turn this off I have to log in with my Microsoft account in the xbox service. THEN I can turn it off. Grrr. So I turn that off and Diablo starts working flawlessly again<br />
<br />
<b>5. It secretly switches your local security to your Microsoft account</b><br />
When I logged it to turn the damn XBOX feature off that was killing Diablo they quietly changed security on my machine to be with my Microsoft account. I didn't know this until the machine rebooted with updates while I was on a business trip and got a call from my fiance that it was prompting for a weird logon. I had to remember my stupid Microsoft password to get her in. I just turned that off this morning. The Microsoft account is just another way for them to track your activity and get their hooks into you<br />
<br />
<b>6. OneDrive is built into windows 10</b><br />
This stupid service kept alerting me when I logged in. You can't uninstall it. You can disable notifications. I don't want this thing. I never did.<br />
<br />
Those are just the things I can think of. I could have swore I paid for Windows 10 for this new computer. The way they treat me you'd think it was freeware.<br />
<br />
Dear Microsoft:<br />
1. I only use your operating system because of gaming. If I could run all my software from linux I would dump you immediately<br />
2. Stop being big brother trying to track everything I do<br />
3. I am not buying one thing from your software store. Ever.<br />
3rdFoundationhttp://www.blogger.com/profile/00211279926522192654noreply@blogger.com0