| 56 | } |
| 57 | |
| 58 | void ParseCommands(dmRender::HRenderContext render_context, Command* commands, uint32_t command_count) |
| 59 | { |
| 60 | dmGraphics::HContext context = dmRender::GetGraphicsContext(render_context); |
| 61 | |
| 62 | for (uint32_t i=0; i<command_count; i++) |
| 63 | { |
| 64 | Command* c = &commands[i]; |
| 65 | switch (c->m_Type) |
| 66 | { |
| 67 | case COMMAND_TYPE_ENABLE_STATE: |
| 68 | { |
| 69 | dmGraphics::EnableState(context, (dmGraphics::State)c->m_Operands[0]); |
| 70 | break; |
| 71 | } |
| 72 | case COMMAND_TYPE_DISABLE_STATE: |
| 73 | { |
| 74 | dmGraphics::DisableState(context, (dmGraphics::State)c->m_Operands[0]); |
| 75 | break; |
| 76 | } |
| 77 | case COMMAND_TYPE_SET_RENDER_TARGET: |
| 78 | { |
| 79 | dmGraphics::SetRenderTarget(context, c->m_Operands[0], c->m_Operands[1]); |
| 80 | break; |
| 81 | } |
| 82 | case COMMAND_TYPE_ENABLE_TEXTURE: |
| 83 | { |
| 84 | // operand order: Hash, Unit, Texture |
| 85 | if (c->m_Operands[0]) |
| 86 | dmRender::SetTextureBindingByHash(render_context, c->m_Operands[0], c->m_Operands[2]); |
| 87 | else |
| 88 | dmRender::SetTextureBindingByUnit(render_context, c->m_Operands[1], c->m_Operands[2]); |
| 89 | break; |
| 90 | } |
| 91 | case COMMAND_TYPE_DISABLE_TEXTURE: |
| 92 | { |
| 93 | // operand order: Hash, Unit, Texture |
| 94 | if (c->m_Operands[0]) |
| 95 | dmRender::SetTextureBindingByHash(render_context, c->m_Operands[0], 0); |
| 96 | else |
| 97 | dmRender::SetTextureBindingByUnit(render_context, c->m_Operands[1], 0); |
| 98 | break; |
| 99 | } |
| 100 | case COMMAND_TYPE_CLEAR: |
| 101 | { |
| 102 | uint8_t r = (c->m_Operands[1] >> 0) & 0xff; |
| 103 | uint8_t g = (c->m_Operands[1] >> 8) & 0xff; |
| 104 | uint8_t b = (c->m_Operands[1] >> 16) & 0xff; |
| 105 | uint8_t a = (c->m_Operands[1] >> 24) & 0xff; |
| 106 | union float_to_uint32_t {float f; uint32_t i;}; |
| 107 | float_to_uint32_t ftoi; |
| 108 | ftoi.i = c->m_Operands[2]; |
| 109 | dmGraphics::Clear(context, c->m_Operands[0], r, g, b, a, ftoi.f, c->m_Operands[3]); |
| 110 | render_context->m_StencilBufferCleared = (c->m_Operands[0] & dmGraphics::BUFFER_TYPE_STENCIL_BIT) != 0; |
| 111 | break; |
| 112 | } |
| 113 | case COMMAND_TYPE_SET_VIEWPORT: |
| 114 | { |
| 115 | dmGraphics::SetViewport(context, c->m_Operands[0], c->m_Operands[1], c->m_Operands[2], c->m_Operands[3]); |