CObjectBase* CObjectManager::FindObjectBase(const CStrW& objectname) { ENSURE(!objectname.empty()); // See if the base type has been loaded yet: std::map<CStrW, CObjectBase*>::iterator it = m_ObjectBases.find(objectname); if (it != m_ObjectBases.end()) return it->second; // Not already loaded, so try to load it: CObjectBase* obj = new CObjectBase(*this); VfsPath pathname = VfsPath("art/actors/") / objectname; if (obj->Load(pathname)) { m_ObjectBases[objectname] = obj; return obj; } else delete obj; LOGERROR(L"CObjectManager::FindObjectBase(): Cannot find object '%ls'", objectname.c_str()); return 0; }
// 全オブジェクト破棄 void CTitleScene::FinObj() { CObjectBase* pObj = m_pObj; CObjectBase* pNext; for (; pObj; pObj = pNext) { pNext = pObj->GetNext(); pObj->Fin(); } }
// 全オブジェクト更新 void CTitleScene::UpdateObj() { CObjectBase* pObj = m_pObj; CObjectBase* pNext; for (; pObj; pObj = pNext) { pNext = pObj->GetNext(); pObj->Update(); } m_pCamera->PostUpdate(); // カメラ更新 }
// 全オブジェクト描画 void CTitleScene::DrawObj() { m_pCamera->PreDraw(); // カメラ反映 // 不透明部分描画 CObjectBase* pObj = m_pObj; for (; pObj; pObj = pObj->GetNext()) { if (pObj->GetDamage() && (m_dwTick & 8)) { continue; } pObj->Draw(); } // 半透明部分描画 LPDIRECT3DDEVICE9 pD = CGraphics::GetDevice(); pD->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); pD->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); pD->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); pD->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); pObj = m_pObj; for (; pObj; pObj = pObj->GetNext()) { if (pObj->GetDamage() && (m_dwTick & 8)) { continue; } pObj->DrawAlpha(); } pD->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); pD->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); }
CUnit* CUnit::Create(const CStrW& actorName, uint32_t seed, const std::set<CStr>& selections, CObjectManager& objectManager) { CObjectBase* base = objectManager.FindObjectBase(actorName); if (! base) return NULL; std::set<CStr> actorSelections = base->CalculateRandomVariation(seed, selections); std::vector<std::set<CStr> > selectionsVec; selectionsVec.push_back(actorSelections); CObjectEntry* obj = objectManager.FindObjectVariation(base, selectionsVec); if (! obj) return NULL; return new CUnit(obj, objectManager, actorSelections, seed); }
CObjectBase* CObjectBase::createObject(const string& name) { CObjectBase* pObject = NULL; CCDictionary* pDict = GAME_OJBECT_MANAGER->getObjectByName(name); if (!pDict) { return NULL; } CCString* strCateName = dynamic_cast<CCString*>(pDict->objectForKey("CateName")); if (NULL == strCateName) { return NULL; } pObject = OBJECT_FACTORY->createInstance(strCateName->getCString()); if (pObject) { pObject->init(pDict); } return pObject; }
// 全オブジェクト初期化 void CTitleScene::InitObj() { CObjectBase* pObj = m_pObj; for (; pObj; pObj = pObj->GetNext()) { pObj->Init(); } }
/*=================================================================================================*/ CObjectBase* CObjectManager::MakeObject( const OBJECT_DATA _ObjectData , const std::string _FilePass ) { CObjectBase* pObject = nullptr; CGimmickBase* pGimmick = nullptr; bool GimmickFlag = false; std::string ObjectName; ObjectName = _ObjectData.Name; if( false ){} // 主人公 else if( _ObjectData.Name == "Player" ){ pObject = m_pPlayer = new CPlayer(); } // オブジェクト else if( _ObjectData.Name == "Box" ){ pObject = new CBox(); } else if( _ObjectData.Name == "Rope" ){ pObject = new CRope(); } else if( _ObjectData.Name == "ChainBox" ){ pObject = new CChainBox(); } else if( _ObjectData.Name == "Fence" ){ pObject = new CFence(); } else if( _ObjectData.Name == "Bridge" ){ pObject = new CBridge(); } else if( _ObjectData.Name == "Light" ){ pObject = new CFluorescentLight(); } else if( _ObjectData.Name == "BreakWall" ){ pObject = new CBreakWall(); } // ギミック else if( _ObjectData.Name == "Switch" ){ pObject = pGimmick = new CSwitch(); GimmickFlag = true; } else if( _ObjectData.Name == "WireMesh" ){ pObject = pGimmick = new CWireMesh(); GimmickFlag = true; } else if( _ObjectData.Name == "LiftX" ){ pObject = pGimmick = new CLiftX(); GimmickFlag = true; } else if( _ObjectData.Name == "LiftY" ){ pObject = pGimmick = new CLiftY(); GimmickFlag = true; } else if( _ObjectData.Name == "Balance" ){ pObject = pGimmick = new CBalance(); GimmickFlag = true; } else if( _ObjectData.Name == "Stairs" ){ pObject = pGimmick = new CStairs(); GimmickFlag = true; } else if( _ObjectData.Name == "Conveyer" ){ pObject = pGimmick = new CConveyer(); GimmickFlag = true; } else if( _ObjectData.Name == "SurveillanceCamera" ){ pObject = pGimmick = new CSurveillanceCamera(); GimmickFlag = true; } else if( _ObjectData.Name == "ClueLever" ){ pObject = pGimmick = new CClueLever(); GimmickFlag = true; } // 敵 else if( _ObjectData.Name == "Fool" ){ pObject = new CFool(); } else if( _ObjectData.Name == "Tackle" ){ pObject = new CTackle(); } // 部屋 else if( _ObjectData.Name == "TutorialRoom" ){ pObject = new CRoomManager( CGame::TUTORIAL_ROOM ); m_ErrorCheckCounter++; } else if( _ObjectData.Name == "Passageway" ){ pObject = new CRoomManager( CGame::PASSAGEWAY ); m_ErrorCheckCounter++; } else if( _ObjectData.Name == "Room1" ){ pObject = new CRoomManager( CGame::ROOM1 ); m_ErrorCheckCounter++; } else if( _ObjectData.Name == "Room2" ){ pObject = new CRoomManager( CGame::ROOM2 ); m_ErrorCheckCounter++; } else if( _ObjectData.Name == "Room3" ){ pObject = new CRoomManager( CGame::ROOM3 ); m_ErrorCheckCounter++; } else if( _ObjectData.Name == "Room4" ){ pObject = new CRoomManager( CGame::ROOM4 ); m_ErrorCheckCounter++; } // ここで座標などをセット pObject->Init( _ObjectData ); pObject->SetActor( CAPP->GetCPhysX()->CreateActor( pObject->GetActorData() ) ); m_pPhysX->SetActorCollisionGroup( pObject->GetActor() , CPhysX::CG_DEFAULT ); std::string String = ( boost::format( "Name : %-22sのオブジェクトを作成しました\n" ) % pObject->GetName().c_str() ).str(); DEBUG->PrintConsole( String , CDebug::ConObjectMake ); pObject->DiscreteInit(); // ギミックを専用のベクターに格納する if( GimmickFlag ){ m_GimmickList.push_back( pGimmick ); } return pObject; }
///////////////////////////////////////////////////////////////////////// /// CRenderCommand //////////////////////////////////////////////////////////////////////// TRESULT CRenderCommand::ProcessCommand( OCRender* pRenderInterface ) { if( NULL == pRenderInterface || false == IsValid() ) return RE_FAILED; switch( GetCommand() ) { case RENDER_COMMAND_START: { pRenderInterface->SetCurrnetRenderPhase( RENDER_PHASE_STARTED ); } break; case RENDER_COMMAND_CAMERA_SETTING: { if( !pRenderInterface->IsRenderStarted() ) return RE_FAILED; CObjectBase* camera = ObjectFactory::FindObject( GetObjectID() ); if( camera )camera->Draw(); } break; case RENDER_COMMAND_BEGIN_DRAW: { if( !pRenderInterface->IsRenderStarted() ) return RE_FAILED; if( !SUCCEEDED(pRenderInterface->BeginDraw()) ) assert(0 && !L"Begin Draw failed"); } break; case RENDER_COMMAND_DRAW: { if( !pRenderInterface->IsRenderStarted() ) return RE_FAILED; CObjectBase* pObjectToDraw = ObjectFactory::FindObject( GetObjectID() ); if( pObjectToDraw ) { pObjectToDraw->Draw(); } } break; case RENDER_COMMAND_END_DRAW: { if( !pRenderInterface->IsRenderStarted() ) return RE_FAILED; OCCamera* camera = ObjectFactory::StaticFindObject<OCCamera>( GetObjectID() ); if( camera ) { pRenderInterface->EndDraw( camera->GetSrcRect(), camera->GetDestRect() ); } } break; case RENDER_COMMAND_FINISH: { pRenderInterface->SetCurrnetRenderPhase( RENDER_PHASE_FINISHED ); } break; default: { return RE_FAILED; } } // This Command was successfully done. Reset it Reset(); return RE_SUCCEED; }
void CHalos::Draw( bln is_stepTwo ) { if( _o_halos.Size() == 0 || _o_mats.Size() < 1 || (!_is_occlude && _visibleHalos == 0) || !is_stepTwo ) { return; } ASSUME( _i_vbDraw ); if( _is_occlude ) { ui32 queriesCount = 0; for( ui32 halo = 0; halo < _o_halos.Size(); ++halo ) { if( !_o_halos[ halo ].testObject ) { continue; } CObjectBase *obj = _o_halos[ halo ].testObject; if( !obj->IsInFrustumGet() || !obj->IsGlowingGet() ) { continue; } if( _o_oqueries.Size() <= queriesCount ) { ASSUME( _o_oqueries.Size() + 1 > queriesCount ); _o_oqueries.Resize( _o_oqueries.Size() + 1 ); D3D11_QUERY_DESC o_queryDesc; o_queryDesc.Query = D3D11_QUERY_OCCLUSION; o_queryDesc.MiscFlags = 0; DXHRCHECK( RendererGlobals::i_Device->CreateQuery( &o_queryDesc, _o_oqueries[ queriesCount ].i_query.AddrModifiable() ) ); } _o_oqueries[ queriesCount ].index = halo; RendererGlobals::i_ImContext->Begin( _o_oqueries[ queriesCount ].i_query ); obj->Draw( true ); RendererGlobals::i_ImContext->End( _o_oqueries[ queriesCount ].i_query ); ++queriesCount; } if( !queriesCount ) { return; } f32 screenSizePixels = RendererGlobals::RenderingWidth * RendererGlobals::RenderingHeight; D3D11_MAPPED_SUBRESOURCE o_sr; DXHRCHECK( RendererGlobals::i_ImContext->Map( _i_vbDraw, 0, D3D11_MAP_WRITE_DISCARD, 0, &o_sr ) ); CVecArr < byte > target( (byte *)o_sr.pData, 0, sizeof( vec4 ) * 4096 ); _visibleHalos = 0; for( ui32 query = 0; query < queriesCount; ++query ) { UINT64 pixels; while( RendererGlobals::i_ImContext->GetData( _o_oqueries[ query ].i_query, &pixels, sizeof(pixels), 0 ) != S_OK ) { } if( !pixels ) { continue; } ui32 index = _o_oqueries[ query ].index; f32 onScreenIntensity = (f32)pixels / screenSizePixels; f32 haloIntensity = _o_halos[ index ].intensity * onScreenIntensity; target.Append( (byte *)&_o_halos[ index ].o_pos, sizeof(vec3) ); target.Append( (byte *)&haloIntensity, sizeof(f32) ); target.Append( (byte *)&_o_halos[ index ].o_color, sizeof(f128color) ); ++_visibleHalos; } RendererGlobals::i_ImContext->Unmap( _i_vbDraw, 0 ); } if( !_visibleHalos ) { return; } for( ui32 mat = 0; mat < _o_mats.Size(); ++mat ) { if( !_o_mats[ mat ].is_geoShaderDefined || !_o_mats[ mat ].is_enabled ) { continue; } if( !_o_mats[ mat ].rstates ) { continue; } RendererGlobals::i_ImContext->IASetInputLayout( _o_mats[ mat ].i_lo ); RendererGlobals::MainBloom.RenderingStatesSet( _o_mats[ mat ].rstates ); D3D11_MAPPED_SUBRESOURCE o_sr; DXHRCHECK( RendererGlobals::i_ImContext->Map( RendererGlobals::ai_VSShaderRegisters[ OBJECT_DATA_BUF ], 0, D3D11_MAP_WRITE_DISCARD, 0, &o_sr ) ); m4x4 o_w = m4x4( _o_w ); LiceMath::M4x4TransposeInplace( &o_w ); _MemCpy( o_sr.pData, &o_w, sizeof(m4x4) ); RendererGlobals::i_ImContext->Unmap( RendererGlobals::ai_VSShaderRegisters[ OBJECT_DATA_BUF ], 0 ); ID3D11Buffer *bufs[ 2 ] = { _o_mats[ mat ].po_geo->i_vbufs[ 0 ], _i_vbDraw }; ui32 offsets[ 2 ] = {}; ui32 strides[ 2 ] = { _o_mats[ mat ].po_geo->strides[ 0 ], sizeof(vec3) + sizeof(f32) + sizeof(f128color) }; RendererGlobals::i_ImContext->IASetVertexBuffers( 0, 2, bufs, strides, offsets ); RendererGlobals::SetPrimitiveTopology( _o_mats[ mat ].po_geo->topo ); RendererGlobals::i_ImContext->OMSetBlendState( _i_blend, 0, 0xFFFFFFFF ); ShadersManager::ApplyShader( _o_mats[ mat ].shader, false ); RendererGlobals::i_ImContext->DrawInstanced( 4, _visibleHalos, 0, 0 ); RendererGlobals::UnbindVBuffers( 0, 2 ); } }