Jump to content
  • Advertisement


  • Content Count

  • Joined

  • Last visited

Community Reputation

536 Good

About deadstar

  • Rank
    Advanced Member

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Hey there! None of the earlier examples on my blog work on real hardware (I didn't get a development kit until later on in the project), I plan to revisit them and correct them all eventually - it's been 5 years since I wrote some of them and my code and knowledge are now a lot better! Here's the improved Hello World example, tidied up and corrected for use on real hardware: https://pastebin.com/kJC99PA7 and here's the workshop I ran which should help explain every single step: https://docs.google.com/presentation/d/1xCFrrsfpcuXVQsfBk8OgGJrbQ4aAiENjPjEny3xu5zQ/edit?usp=sharing Matt
  2. deadstar

    How to Log and stay Modular

    I don't understand this fascination either. It would drive me insane having to create a logging object everywhere I needed to add an entry, or passing a logger reference to all my functions, let alone having to manually enter the filename to write to. In my opinion the single most useful and quickest to use logging method is: #define Log(msg) SomeFreeLoggingFunction(msg, __FILE__, __LINE__) Now go and worry about writing the game instead.
  3. Hi all, I have a Visual C++ 2010 solution set up with an 'Engine' project, which depends on Ogre3D. I'm using this Engine project as a dependency for a 3d Studio Max exporter plugin project, which makes use of the 3D mesh file format reader/writer (one .h and one .cpp file) contained within the Engine project. The problem I'm having is that when I build the Exporter project, it fails to resolve linker dependencies for bits of Ogre, even though none of that stuff is used in the Exporter project (I literally only make use of a 'Mesh' class and its Mesh::Write() function, which just opens a file and dumps data). How can I set up my solution so that only the required dependencies from the Engine project are linked with the Exporter project? I've tried #ifndef'ing away anything that depends on Ogre with a '3DS_PLUGIN' preprocessor definition, which I've added to the project's settings, but it seems to be ignored when the Exporter project auto-builds Engine as a dependency (I've tested this by added '#error' inside the #ifndef). Does anyone have ideas how I can achieve this?
  4. deadstar

    Never assume people know you think your code is crap

    If I have to paste some code in an email I quite often doctor it there-and-then to make it look its best, especially if the destination is external to the company. Just habit I suppose, but certainly not a bad habit to get into. The fact that you actually care how others read and understand your code is a marvellous thing, though.
  5. deadstar

    Best Sound API?

    Depending on which platforms/languages you're aiming to support, Microsoft's XACT might be something to look at (http://msdn.microsoft.com/en-us/library/ee416188%28v=VS.85%29.aspx). It's an audio API plus set of UI tools for creating sound waves, banks, events and effects, with a data-driven API to get the stuff working in game exactly how you authored it. Documentation is excellent, sample code is plentiful and since it's mostly aimed towards the XNA community the support forums are lively.
  6. deadstar

    Best Sound API?

    I've had an excellent experience with FMOD (www.fmod.org), but it does depend on how complex the audio design for your game will be. If you want your game to make some noise and play music tracks, then OpenAL is quick and simple to set up and supports a variety of platforms, but if you want an all-singing-all-dancing event-based audio subsystem with UI tools and advanced effects then OpenAL has been a little outdated for years. What would you like to achieve?
  7. Your poll only allows the selection of one format - there is no 'one size fits all' in most cases (some consoles have decoding-on-chip which allows a single format to be used for short sound effects AND long streaming tracks). For PC I generally use WAV (PCM16) for sound effects, and OGG for streaming tracks. As for MP3 licensing: Do I need a license to use mp3 or mp3surround in games? Yes. Games using mp3 encoded content are licensed on a per-title basis. However, no license fees are due if less than 5 000 copies of a particular game title are distributed. [/quote] From: http://mp3licensing.com/help/developers.html#59 License prices: http://mp3licensing.com/royalty/games.html
  8. I got my reply about 24 hours later, if this helps
  9. deadstar

    Most satisfying game you've played and why

    Half-Life and its sequels. Pick any First-Person Shooter and analyse the protagonist - I reckon he'll be a Marine or some super goverment based bad-ass with guns wired to his teeth. Gordon Freeman is just a regular, he had a pretty bad day at work and now he just happens to be trawling through some science complex keeping himself alive with whatever weaponry he can find. The guy's probably never held a gun before. I can relate, and I love that. He doesn't talk in the game, it's first-person, and he's rarely seen, therefore that's me right there shitting bricks and running around like a headless chicken. Complete immersion. I love the characters, the story, the Black Mesa vs. Aperture Science thing up in the air, the weapons, the technology, the enemies, the creatures and monsters, the deserted and lonely middle-of-nowhere sections, the familiar chirp of a dead Combine's radio, Dr Breen's face lighting up every screen, the absolutely gorgeous scenery and right down to the very engine it was written with. ...which is why that Timeshift game p**sed me off so much. Ripped off every little piece I loved.
  10. deadstar

    short sounds versus long sounds

    WAV files contain uncompressed PCM audio, which can be opened, read and fed straight to the sound chip with no data conversion. If you have a scene in your game with 40+ sound effects playing simultaneously, this is ideal, since there's little CPU time involved and the sound chip does all of the work. OGG files require a lot more work from the CPU to decode on the fly. Data must be decoded - in realtime - into packets of PCM data, which is all done using the CPU. If you try to do this with 40+ simultaneous files, your system will choke. There's no "one size fits all" audio format, UNLESS the hardware supports the decoding on the fly. On the Xbox 360 for example, the sound chip is custom designed to handle the decoding of XMA2 data, so that one format can be used for one-shot sound effects, long dialogue or to stream in music tracks. It is possible to open all the necessary OGG files at load time, decode them and have the PCM data sit there in memory ready for use, but that all depends on your target platform - I wouldn't consider a method like this for iPhone, for example. Since I try my best to code cross-platform, I find using WAVs for sound effects and OGG for long tracks to suit the majority of devices just fine.
  11. deadstar

    C vs C++

    Your post is titled "Which programming language is better in terms of creating a game engine?" yet your poll is titled "Which language do you find easier?" I find C++ easier, because my programming and thinking is very object oriented, and although anything I program could also be done with C, I find classes, templates and new/delete memory management to be invaluable tools for knocking up projects quickly, efficiently and with minimal amount of bugs. As for which is better for a game engine, that's way too broad a question. Which type of game is the engine suited for? Which platforms are you targeting? Who will be using the engine? What compiler and version(s) will be in your toolchain? Which external libraries are you hoping to use along the way? Which language do you know more of? That's just a few of a thousand questions I could ask, but it all boils down to "with which language could you get a game finished quicker?" ...and don't make engines, make games.
  12. Step 1 - familiarise yourself with some basic 3D maths. For your particular case, look up 3D Vectors - find out what they are, how to add them together, how to use them to represent a position in 3D space Step 2 - make a basic structure to represent your Vector3. In C++, this would look something like: class Vector3 { public: Vector3() { x = y = z = 0.0f; } float x; float y; float z; }; Step 2 - figure out how to apply a desired translation before rendering your 3D object : - Create a Vector3 to represent your object's position - Add/subtract to/from your vector depending on keyboard input - Use OpenGL's glTranslatef() function to apply the translation before your render you object In its very basic form, your rendering loop will need to look something like: //Push an identity matrix to the stack //(any glTranslate operation you do operates on the current matrix - you'll need a blank slate to work with. Look up 'world space' and 'object space' to see what we're doing here) glPushMatrix(); //Apply the desired translation glTranslatef(myVector.x, myVector.y, myVector.z); //Render your object, as you're already doing //Pop the matrix stack glPopMatrix(); Once you've grasped the basics, I recommend reading up on 3D Matrix - what they are, how to use them to represent a position and rotation in 3D space, how to add/multiply them together, and how they apply to OpenGL.
  13. Hi, Our audio app is using AUGraphs containing a mixer unit, a converter unit and an output unit. It's a realtime app, so performance is a high concern. An issue has been flagged up where AUGraphStop() takes 25 milliseconds to complete on the main thread, and our profiler shows that it spends this time sleeping. Could anyone explain why this happens? Is it waiting for the next zero crossover point, or waiting for one more buffer to render? I've tried several workarounds, including sending one render frame of silence (and setting the kAudioUnitRenderAction_OutputIsSilence flag) before attempting to stop, and calling AUGraphStop() inside the kAudioUnitRenderAction_PostRender notify callback (this has mixed results, and after reading around it doesn't seem a recommended approach). Here's how we are initialising the graph: //Configure converter/mixer/output unit descriptors AudioComponentDescription OutputUnitDesc = { kAudioUnitType_Output ,kAudioUnitSubType_DefaultOutput, kAudioUnitManufacturer_Apple }; AudioComponentDescription MixerUnitDesc = { kAudioUnitType_Mixer, kAudioUnitSubType_MatrixMixer, kAudioUnitManufacturer_Apple }; AudioComponentDescription ConverterUnitDesc = { kAudioUnitType_FormatConverter, kAudioUnitSubType_AUConverter, kAudioUnitManufacturer_Apple }; //Create graph CA_ERR(NewAUGraph(&mAudioGraph)); //Add converter/mixer/output nodes CA_ERR(AUGraphAddNode(mAudioGraph, &OutputUnitDesc, &mOutputNode)); CA_ERR(AUGraphAddNode(mAudioGraph, &MixerUnitDesc, &mMixerNode)); CA_ERR(AUGraphAddNode(mAudioGraph, &ConverterUnitDesc, &mConverterNode)); //Connect nodes CA_ERR(AUGraphConnectNodeInput(mAudioGraph, mConverterNode, 0, mMixerNode, 0)); CA_ERR(AUGraphConnectNodeInput(mAudioGraph, mMixerNode, 0, mOutputNode, 0)); //Open the graph (instantiates the units) CA_ERR(AUGraphOpen(mAudioGraph)); //Get the created units CA_ERR(AUGraphNodeInfo(mAudioGraph, mOutputNode, NULL, &mOutputUnit)); CA_ERR(AUGraphNodeInfo(mAudioGraph, mMixerNode, NULL, &mMixerUnit)); CA_ERR(AUGraphNodeInfo(mAudioGraph, mConverterNode, NULL, &mConverterUnit)); //Setup stream format description mStreamDesc.mFormatID = kAudioFormatLinearPCM; mStreamDesc.mFormatFlags = kLinearPCMFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger; mStreamDesc.mChannelsPerFrame = Header->nChannels; mStreamDesc.mSampleRate = (Float64)Header->nSamplesPerSec; mStreamDesc.mBitsPerChannel = Header->wBitsPerSample; mStreamDesc.mBytesPerFrame = (Header->wBitsPerSample >> 3) * Header->nChannels; mStreamDesc.mFramesPerPacket = 1; mStreamDesc.mBytesPerPacket = mStreamDesc.mBytesPerFrame * mStreamDesc.mFramesPerPacket; mStreamDesc.mReserved = 0; //Set data endianness according to file type - TODO: Get endianness from header AudioSystem::FileType FileType = mSample->GetFiletype(); if(FileType == AudioSystem::WAV) mStreamDesc.mFormatFlags |= kAudioFormatFlagsNativeEndian; else if(FileType == AudioSystem::OGG) mStreamDesc.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian; //Configure number of input/output busses for mixer unit int NumChannelsIn = Header->nChannels; int NumChannelsOut = (int)AudioSystem::GetOutputChannelConfig(); CA_ERR(AudioUnitSetProperty(mMixerUnit, kAudioUnitProperty_BusCount, kAudioUnitScope_Input, 0, &NumChannelsIn, sizeof(u32))); CA_ERR(AudioUnitSetProperty(mMixerUnit, kAudioUnitProperty_BusCount, kAudioUnitScope_Output, 0, &NumChannelsOut, sizeof(u32))); //Set render callback AURenderCallbackStruct callback = { AudioRenderCallback, this }; CA_ERR(AUGraphSetNodeInputCallback(mAudioGraph, mConverterNode, 0, &callback)); //Set stream format to something native to CoreAudio AudioStreamBasicDescription OutputDesc = {0}; UInt32 Size = sizeof(AudioStreamBasicDescription); CA_ERR(AudioUnitGetProperty(mMixerUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &OutputDesc, &Size)); //Set num output channels OutputDesc.mChannelsPerFrame = (int)AudioSystem::GetOutputChannelConfig(); //Set stream format CA_ERR(AudioUnitSetProperty(mConverterUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &mStreamDesc, sizeof(AudioStreamBasicDescription))); CA_ERR(AudioUnitSetProperty(mConverterUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &OutputDesc, sizeof(AudioStreamBasicDescription))); CA_ERR(AudioUnitSetProperty(mMixerUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &OutputDesc, sizeof(AudioStreamBasicDescription))); CA_ERR(AudioUnitSetProperty(mMixerUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &OutputDesc, sizeof(AudioStreamBasicDescription))); CA_ERR(AudioUnitSetProperty(mOutputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &OutputDesc, sizeof(AudioStreamBasicDescription))); //Initialise graph CA_ERR(AUGraphInitialize(mAudioGraph)); //Set notification callback CA_ERR(AUGraphAddRenderNotify(mAudioGraph, AudioNotifyCallback, this)); //Set global mixer volume CA_ERR(AudioUnitSetParameter(mMixerUnit, kMatrixMixerParam_Volume, kAudioUnitScope_Global, 0xFFFFFFFF, 1.0, 0)); //Set input channel volumes for(int i = 0; i < Header->nChannels; i++) { CA_ERR(AudioUnitSetParameter(mMixerUnit, kMatrixMixerParam_Volume, kAudioUnitScope_Input, i, 1.0, 0)); } //Set output channel volumes for(int i = 0; i < (int)AudioSystem::GetOutputChannelConfig(); i++) { CA_ERR(AudioUnitSetParameter(mMixerUnit, kMatrixMixerParam_Volume, kAudioUnitScope_Output, i, 1.0, 0)); } The graph is started and stopped using AUGraphStart() and AUGraphStop(), nothing special. Here's the callstack captured using Shark Profiler: | | | | | | | | | + 1.3%, AudioUnitGraph::Stop(), AudioToolbox | | | | | | | | | | + 1.3%, AudioOutputUnitStop, AudioUnit | | | | | | | | | | | + 1.3%, CallComponentDispatch, CarbonCore | | | | | | | | | | | | + 1.3%, DefaultOutputAUEntry, CoreAudio | | | | | | | | | | | | | + 1.3%, AUHALEntry, CoreAudio | | | | | | | | | | | | | | + 1.3%, usleep$UNIX2003, libSystem.B.dylib | | | | | | | | | | | | | | | + 1.3%, nanosleep$UNIX2003, libSystem.B.dylib | | | | | | | | | | | | | | | | 1.3%, __semwait_signal, libSystem.B.dylib It spends the entirety of AUGraphStop() just sleeping! I've tried lowering the number of frames per slice, but it doesn't seem to make a difference. I've also tried removing all audio units except the output node, in an attempt to narrow the problem down to a specific unit, but the cost of AUGraphStop() still stands at 25ms. Any clues?
  14. deadstar

    Game Audio: shopping your wares in the industry

    Haveyou heard of people trying to get into the film industry doing re-scores? How about trying that with a game? Strip out all the audio and recreate it from scratch - the soundtrack, every sound effect, including the placement of sounds in levels and on character animation, effective use of reverb areas and low pass filters. If you did a whole game, that would look insanely good on your demo reel!
  15. This is the third title released with my name in the credits, and I'm so excited I'm almost shaking! It's out now on Xbox Live (Gold exclusive) - go to Game Marketplace -> Explore -> Games & Demos -> Demos. Laugh your way through an all-new story with the LEGO Star Wars III demo. This demo includes both space and ground levels from the most action-packed LEGO Star Wars game to date. In the full version, the story takes you through 16 different systems and experience brand new features like massive ground battles, boss fights, and multi-layered space combat. Other enhancements include expanded Force abilities, brand new weapons, characters, environments, and over 20 story-based missions.[/quote] Eeeeeeeeeeeeeeeeee I can't wait to see it on the shelves!!
  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!