What do you say when offered a lifelong position in the most powerful and corrupt secret organization in mankind’s history?
If you want your life to last longer than the job interview, you say yes.
In exchange for wealth, power, and training for his newly discovered abilities, all Daniel has to do is help them reach a new, unsuspecting world.
To make things worse, a group of desperate escapees pin their thin hopes on him, willing to risk everything on a miracle that Daniel has no idea how to provide.
Shackled with a restraint bracelet, constant surveillance, and superhuman captors, he must outsmart an overwhelmingly powerful enemy and seek freedom in the one place that is left to him, a new world that only he can reach.
In the Demi-Monde, author Rod Rees has conjured up a terrifying virtual reality, a world dominated by history’s most ruthless and bloodthirsty psychopaths—from Holocaust architect Reinhard Heydrich to Torquemada, the Spanish Inquisition’s pitiless torturer, to Josef Stalin’s bloodthirsty right-hand man/monster, the infamous Beria. The Demi-Monde: Winter kicks off a brilliant, high concept series that blends science fiction and thriller, steampunk and dystopian vision. If Neil Gaiman, Neal Stephenson, James Rollins, and Clive Cussler participated in Suzanne Collins’s The Hunger Games, the result might be something akin to the dark and ingenious madness of Rees’s The Demi-Monde: Winter.
The book is well imagined, but there are some plot and characterization problems which make it less than perfect, and the ending is aggravating.
What really annoys me about this books is something that’s so subtextual to the author’s world view that it’s never explicitly mentioned in the book:
The premise of the book is that because of their failures in Iraq and Afghanistan the US Army has created a virtual world to train their soldiers to be better at Asymmetrical Warfare. Not everyone will be familiar with the concept, but basically Asymmetrical Warfare means a big force fighting a small force. This causes the small force to use tactics like running away and hiding, setting ambushes and assassinating officers – they used to call it Guerrilla Warfare.
There are no politics, philosophy or morality associated with Asymmetrical Warfare - it’s just a set of tactics that any small force would use when faced with an overwhelmingly larger one. So in the case of Iraq and Afghanistan, the US Army is the large force and the locals are the small force – if the locals were the large force they wouldn’t have to resort to IEDs and hiding in the hills or among the civilian populace.
What annoys me is that the author has the US Army send their soldiers into a virtual world to train them in Asymmetric Warfare, but as plucky rebels fighting an evil empire run by Nazis. This is completely backward to the situation they’ll actually find themselves in, and makes no sense.
I can only assume that the author is so incapable of seeing the US Army as the evil empire side of the asymmetry that he had to cast them as the plucky rebels that they haven’t been since the Revolutionary War. This is especially odd considering that I don’t think the author is American.
For Durzo Blint, assassination is an art-and he is the city’s most accomplished artist.
For Azoth, survival is precarious. Something you never take for granted. As a guild rat, he’s grown up in the slums, and learned to judge people quickly – and to take risks. Risks like apprenticing himself to Durzo Blint.
But to be accepted, Azoth must turn his back on his old life and embrace a new identity and name. As Kylar Stern, he must learn to navigate the assassins’ world of dangerous politics and strange magics – and cultivate a flair for death.
This reminded me of some other modern fantasy series I’ve read in the last few years – the assassin-in-training bit reminded me of The Farseer Trilogy and the politics-and-crime reminded me of The Gentleman Bastard Sequence. Although it doesn’t quite beat them out it’s pretty close.
The way the book builds tension and drama is by putting the main character’s friends in danger. Sometimes that can feel gratuitous, but maybe I’m just getting squeamish in my old age.
Tom Dreyfus is a Prefect, a law enforcement officer. His current case: investigating a murderous attack against one of the Glitter Band habitats that leaves nine hundred people dead. But then he uncovers an even greater threat-a covert plot by an enigmatic entity seeking nothing less than total control of the Glitter Band.
The last book I read by Alastair Reynolds was House of Suns, which was awesome. Unfortunately it was a lot better than The Prefect, which I found disappointing.
It’s been a long time since I read the previous books in the Revelation Space series, so it took me a while to remember the preceding plot and characters, which reduced my enjoyment.
It started off feeling like a cliche space opera, but got better as it went.
There were some technical problems with the book – I think there was a separator missing so it seemed to change points of view between paragraphs without warning.
Civilization as we know it ended more than fifteen years ago, leaving as it’s legacy barren wastelands called the Deadland and a new terror for the humans who survived- hordes of undead Biters.
Fifteen year-old Alice has spent her entire life in the Deadland, her education consisting of how best to use guns and knives in the ongoing war for survival against the Biters. One day, Alice spots a Biter disappearing into a hole in the ground and follows it, in search of fabled underground Biter bases.
What Alice discovers there propels her into an action-packed adventure that changes her life and that of all humans in the Deadland forever. An adventure where she learns the terrible conspiracy behind the ruin of humanity, the truth behind the origin of the Biters, and the prophecy the mysterious Biter Queen believes Alice is destined to fulfill.
A prophecy based on the charred remains of the last book in the Deadland- a book called Alice in Wonderland.
From the title I was hoping that this book would be a fresh take on some old ideas, in the same vein as Pride and Prejudice and Zombies. Unfortunately it never came within miles of its potential.
My major problem with the book is that there’s no subtlety, no depth. The characters are two dimensional (or less) and the plot is a series of straight lines. It feels like it’s going to follow in the footsteps of I Am Legend in humanizing the monsters and monsterizing the humans but seems to lose interest in favor of action sequences and so fails utterly.
The other problem is that it has basically nothing to do with Alice in Wonderland except for the name of the main character. All references to Alice in Wonderland could have been removed and it would have been pretty much the same book.
Zed is an agent from the future. A time when the world’s problems have been solved. No hunger. No war. No despair.
His mission is to keep it that way. Even if it means ensuring every cataclysm throughout history runs its course-especially The Great Conflagration, an imminent disaster in our own time that Zed has been ordered to protect at all costs.
Zed’s mission will disrupt the lives of a disgraced former CIA agent; a young Washington lawyer grieving over the loss of her brother, a soldier in Iraq; the oppressed employee of a foreign diplomat; and countless others. But will he finish his final mission before the present takes precedence over a perfect future? One that may have more cracks than he realizes?
This is an interesting book. The concept of sending time travellers back to ensure that catastrophes happen is great. Actually reading it is a lot more complicated – I won’t spoil why, but things may not be as they seem.
There are several points of view and the plotlines interact in complicated ways, so at times I found it difficult to keep track of what the characters’ interactions with each other were.
The ending is pretty ambiguous, but it’s obviously intentional and not incompetence.
Sky piracy is a bit out of Darian Frey’s league. Fate has not been kind to the captain of the airship Ketty Jay—or his motley crew. They are all running from something. Crake is a daemonist in hiding, traveling with an armored golem and burdened by guilt. Jez is the new navigator, desperate to keep her secret from the rest of the crew. Malvery is a disgraced doctor, drinking himself to death. So when an opportunity arises to steal a chest of gems from a vulnerable airship, Frey can’t pass it up. It’s an easy take—and the payoff will finally make him a rich man.
But when the attack goes horribly wrong, Frey suddenly finds himself the most wanted man in Vardia, trailed by bounty hunters, the elite Century Knights, and the dread queen of the skies, Trinica Dracken. Frey realizes that they’ve been set up to take a fall but doesn’t know the endgame. And the ultimate answer for captain and crew may lie in the legendary hidden pirate town of Retribution Falls. That’s if they can get there without getting blown out of the sky.
The premise is basically steampunk Firefly, which should have guaranteed it five stars from me, however I found the book to be unsatisfying.
I think it just wasn’t deep enough – the characters tend to have one defining characteristic, one problem that needs to be solved etc.
Maybe it’s just below my reading level or something. It felt like reading a graphic novel, but without the art.
Temperance Brennan, like her creator Kathy Reichs, is a brilliant, sexy forensic anthropologist called on to solve the toughest cases. But for Tempe, the discovery of a young girl’s skeleton in Acadia, Canada, is more than just another assignment. Évangéline, Tempe’s childhood best friend, was also from Acadia. Named for the character in the Longfellow poem, Évangéline was the most exotic person in Tempe’s eight-year-old world. When Évangéline disappeared, Tempe was warned not to search for her, that the girl was “dangerous.”
Thirty years later, flooded with memories, Tempe cannot help wondering if this skeleton could be the friend she lost so many years ago. And what is the meaning of the strange skeletal lesions found on the bones of the young girl?
Meanwhile, Tempe’s beau, Ryan, investigates a series of cold cases. Three girls dead. Four missing. Could the New Brunswick skeleton be part of the pattern? As Tempe draws on the latest advances in forensic anthropology to penetrate the past, Ryan hunts down a serial predator.
This is a pretty good entry in the series.
As usual there were unnecessary misunderstandings in the personal relationship plotline, but they were a bit less annoying in this book than they have been in some of the previous ones.
Also as usual there was a lot of exposition about forensic techniques.
What’s different about this book is the investigation into something from deep in Tempe’s past, which gives it a different twist.
This post is the fourth in a series (see previous posts with the virtual machine tag) chronicling my project to write an 8-bit virtual machine. I’m currently working on rendering the screen using the GPU and using a pixel shader to make it look like a CRT.
After two weeks of extreme frustration, I was finally able to render my virtual machine’s screen with a post-processing effect! I used a built-in effect rather than a custom pixel shader to keep things as simple as possible, and from the available effects I chose the Gaussian blur effect because it only has one setting and it’s immediately obvious whether or not it’s working.
Although it’s possible to add an effect to my existing rendering pipeline that used HwndRenderTarget, it turned out that this would involve a large proportion of the work that it would take to get the swap chain method working, so I ended up using that instead. A benefit of using a swap chain is that it has vsync support built into it, which should eliminate the tearing I was seeing when the virtual machine updated the screen quickly.
The reason it takes a lot of work to use effects is that they’re closely tied to device contexts, and to get the device context you have to jump through some flaming hoops. Fortunately pretty much all of this can be extracted from the SharpDX Windows 8 samples, although as I mentioned in a previous post the code is spread over multiple classes so it can be difficult to track down.
First create a Direct2D.Factory1. You were going to do create a Direct2D.Factory anyway and it’s really no different:
All the QueryInterface stuff seems to be how they’ve added the v1.1 features to v1.0 while maintaining backward compatibility. I suppose it makes sense, but I can’t say it’s discoverable or self-evident though.
Now we go nuts and rope in DXGI – we get a DXGI.Device1from the Direct3D11.Device1 which we keep just long enough to create a Direct2D1.Device from it:
Using dxgiDevice As DXGI.Device1= _d3dDevice.QueryInterface(Of DXGI.Device1)()
_d2dDevice =New Direct2D1.Device(_d2dFactory, dxgiDevice)EndUsing
Then we create a Direct2D1.DeviceContext from the Direct2D1.Device. Things are more sane in the Direct2D world, so there are no gymnastics:
You’re going to love this next one. We get a DXGI.Device2 from the Direct3D11.Device1 (for only as long as we need it). From that we get a DXGI.Adapter (for only as long as we need it). From that we get its DXGI.Factory2 (you get the idea) and from that we can create a DXGI.SwapChain1:
Dim scd AsNew SwapChainDescription1
'not setting width or height because 0 sets automatic sizing.Format= Format.B8G8R8A8_UNorm.SampleDescription=New DXGI.SampleDescription(1, 0)' no multi-sampling.Usage= DXGI.Usage.BackBufferOr DXGI.Usage.RenderTargetOutput.BufferCount=2' double buffer.Scaling= DXGI.Scaling.Stretch.SwapEffect= DXGI.SwapEffect.FlipSequentialEndWithUsing dxgiDevice2 As DXGI.Device2= _d3dDevice.QueryInterface(Of DXGI.Device2)()Using dxgiAdapter As DXGI.Adapter= dxgiDevice2.AdapterUsing dxgiFactory2 As DXGI.Factory2= dxgiAdapter.GetParent(Of DXGI.Factory2)()
_swapChain = dxgiFactory2.CreateSwapChainForHwnd(_d3dDevice, _
Nothing)' Ensure that DXGI does not queue more than one frame at a time.' This both reduces latency and ensures that the application will' only render after each VSync
I’m using _pb.Handle to connect the swap chain to my control (in this case _pb is a PictureBox), which tells you that what we’ve done so far has been pretty much the equivalent of one line of code to create a HwndRenderTarget.
We create a Direct3D11.Texture2D from the swap chain:
(I actually can’t see anywhere I’m using that, so it may be superfluous…)
We get the back buffer from the swap chain as a DXGI.Surface (for only as long as we need it) and create a Direct2D1.Bitmap1 from it:
Dim pf AsNew Direct2D1.PixelFormat(DXGI.Format.B8G8R8A8_UNorm, _
Direct2D1.AlphaMode.Premultiplied)Dim bp AsNew Direct2D1.BitmapProperties1(pf, sDPIX, sDPIY, _
Direct2D1.BitmapOptions.CannotDraw)Using dxgiBackBuffer As DXGI.Surface= _swapChain.GetBackBuffer(Of DXGI.Surface)(0)
_bmpTarget =New Direct2D1.Bitmap1(_d2dContext, dxgiBackBuffer, bp)EndUsing
Finally we set the Direct2D1.DeviceContext’s target to the bitmap so that drawing using the context outputs to the back buffer which then ends up on the screen when the swap chain presents:
See what I mean? The HwndRenderTarget solution took place entirely in Direct2D, consisted of one Bitmap and two Render Targets and rendering only needed DrawBitmap. The swap chain solution involves a bunch of new classes in Direct3D, DXGI and Direct2D.
If there had been a way to apply an effect without needing to involve the device context, this whole project would have been trivial.
The “source” of the problem
A stumbling block that I had setting up the effects was the Bitmap source effect. All of the SharpDX Windows 8 effect samples use it as the source that the effects apply to, but (after a lot of frustration) it turns out that it’s only used for static bitmaps, not temporary bitmaps as I needed.
To apply your effect chain to a temporary bitmap, first you need to create a Bitmap1 that’s compatible with your device context:
Dim bp AsNew BitmapProperties1
bp.PixelFormat.AlphaMode= Direct2D1.AlphaMode.IgnoreDim _bmpBuffer AsNew Bitmap1(_d2dContext, New DrawingSize(640, 400), bp)
Then you can set the input of your effect to this bitmap:
_blurEffect.SetInput(0, _bmpBuffer, True)
It’s pretty easy once you know it’s possible.
You can also create a Render Target that allows you to draw on the bitmap (in my case so I can draw the characters onto the temporary bitmap):
Even though the VPU now uses the GPU extensively, it still uses up a lot of CPU while it’s running. I thought that maybe this was caused by my using a RenderTarget to draw the characters onto the temporary bitmap instead of something more in keeping with the swap chain – you’re supposed to just connect up effects like Lego bricks.
So I investigated the Atlas effect. It appears to be designed to help get sprites out of a sprite sheet and draw them, so it sounded like the right thing to use. Unfortunately it seems that each Atlas effect only draws one sprite so I’d need to connect up 2000 of them, which is insane.
I found some places online advising to use a RenderTarget to draw sprites onto a temporary bitmap so I’m going to stick with that.
The “scale” of the problem
One of the last steps of my render pipeline is to draw the temporary bitmap onto the swap chain’s back buffer scaled to fit while maintaining aspect ratio.
In the HwndRenderTarget solution this was done simply by passing a destination rectangle to DrawBitmap, but Direct2D1.DeviceContext.DrawImage doesn’t take a destination rectangle.
Once again I had two choices – an effect-like solution and a non-effect-like solution. I could either add a Scale effect which would take the output of the last effect in my chain and scale it in some way before passing it on to the DeviceContext or I could use a transform matrix.
To cut a long story short, I once again decided on the non-effect-like solution. In spite of my math education somehow failing to teach me matrices, I still found it easier to get that working than the Scale effect.
The tunnel at the end of the tunnel
The next (and hopefully final) step in the saga of “Oh I Know, I’ll Just Add A CRT Pixel Shader, That’ll Be Cool” is to find a CRT pixel shader and get it working in SharpDX. When stated like that it doesn’t seem like I’ve made much progress at all…
I’ve found several CRT pixel shaders – interestingly all on arcade emulator forums. Most of the shaders I found were for OpenGL, so it took more searching to find ones that people had converted for DirectX.
The problem I have now is that all of the pixel shaders seem to be for DirectX 9 which SharpDX (or DirectX 11.1) is having problems with.
My last resort is to learn HLSL and write my own shader from scratch, but that’ll really drag this project out.
In my search for a HLSL CRT pixel shader I ran across this amazing video demonstrating how far someone’s gone to reproduce all of the visual glitches that you could get with an analog PAL TV:
I don’t think I need to go quite that far, but it’s extremely impressive.